From 3a688b036f186bbdca8a50a4ddcb1a3b45d0d5cd Mon Sep 17 00:00:00 2001 From: Juan Cruz Fortunatti Date: Tue, 27 Oct 2026 03:52:23 +0100 Subject: [PATCH] feat(m45): show the Pleiades within Galactic dust --- .gitignore | 3 + packages/astronomy/data/bodies/alcyone.json | 54 +- packages/astronomy/data/bodies/celaeno.json | 54 +- packages/astronomy/data/bodies/merope.json | 54 +- packages/astronomy/data/bodies/pleione.json | 54 +- packages/bake/authoring/m45/dust/README.md | 37 + .../m45/dust/acquisition/edenhofer.mts | 56 + .../m45/dust/acquisition/named-star-table.mts | 30 + .../bake/authoring/m45/dust/atlas/pack.mts | 52 + .../authoring/m45/dust/atlas/pack.test.mts | 42 + packages/bake/authoring/m45/dust/bake.mts | 163 + .../m45/dust/column/compact-clean.mts | 202 + .../bake/authoring/m45/dust/column/fit.mts | 416 + .../bake/authoring/m45/dust/column/intake.mts | 44 + .../authoring/m45/dust/column/load-cube.mts | 6 + .../bake/authoring/m45/dust/column/map.mts | 21 + .../authoring/m45/dust/column/prepare.mts | 9 + .../bake/authoring/m45/dust/column/types.mts | 5 + .../bake/authoring/m45/dust/field/density.mts | 40 + .../authoring/m45/dust/field/depth-prior.mts | 80 + .../authoring/m45/dust/field/foreground.mts | 35 + .../m45/dust/field/foreground.test.mts | 17 + .../bake/authoring/m45/dust/field/grid.mts | 18 + .../m45/dust/field/prepare-depth-record.mts | 11 + .../authoring/m45/dust/field/transmission.mts | 81 + .../authoring/m45/dust/geometry/patches.mts | 73 + .../authoring/m45/dust/geometry/reference.mts | 10 + .../authoring/m45/dust/geometry/windows.mts | 15 + .../m45/dust/geometry/windows.test.mts | 14 + .../m45/dust/install-transaction.mts | 13 + .../m45/dust/install-transaction.test.mts | 9 + packages/bake/authoring/m45/dust/install.mts | 30 + .../authoring/m45/dust/panorama/geometry.mts | 45 + .../authoring/m45/dust/panorama/guard.mts | 33 + .../authoring/m45/dust/panorama/integrate.mts | 138 + .../authoring/m45/dust/panorama/seams.mts | 72 + .../m45/dust/panorama/seams.test.mts | 71 + .../authoring/m45/dust/physics/config.mts | 22 + .../m45/dust/physics/illumination.mts | 25 + .../bake/authoring/m45/dust/physics/isrf.mts | 170 + .../bake/authoring/m45/dust/physics/types.mts | 10 + .../bake/authoring/m45/dust/tsconfig.json | 12 + packages/objects/src/image-layer-bank.test.ts | 17 +- packages/objects/src/image-layer-bank.ts | 20 +- packages/objects/src/index.ts | 3 +- .../catalogue/point-transmission.ts | 34 + .../prepared-data/cloud/cloud-points.test.ts | 16 + .../src/prepared-data/cloud/cloud-points.ts | 13 +- .../presentation/prepared-leaf-bounds.ts | 2 + .../src/volume/delivery/css-volume-types.ts | 2 + .../delivery/css-volume-validation.test.ts | 27 + .../volume/delivery/css-volume-validation.ts | 14 +- .../delivery/prepared-volume-topology.ts | 10 +- .../renderer/src/prepared-data/readers.ts | 3 +- .../src/sky/prepared-sky-runtime.test.ts | 2 +- .../renderer/src/styles/volume-clip.test.mts | 26 + packages/renderer/src/styles/volume.css | 3 +- .../clouds/cloud-overlay-reader.test.ts | 28 + .../universe/clouds/cloud-overlay-reader.ts | 3 +- .../src/universe/clouds/cloud-points.test.ts | 64 + .../src/universe/clouds/cloud-points.ts | 39 +- .../universe/clouds/dataset-cloud-overlays.ts | 34 + .../points/batched-spatial-points.test.ts | 17 + .../universe/points/batched-spatial-points.ts | 54 +- .../src/universe/points/point-paths.ts | 12 +- .../points/point-transmission-reader.ts | 6 + .../points/point-transmission-transport.ts | 4 + .../points/prepared-transmission.test.ts | 163 + .../universe/points/prepared-transmission.ts | 92 + .../src/universe/prepared-universe-types.ts | 6 +- .../universe/universe-dataset-banks.test.ts | 72 +- .../src/universe/universe-dataset-banks.ts | 28 +- .../volume/prepared-volume-datasets.test.ts | 13 + .../src/volume/prepared-volume-datasets.ts | 6 +- .../volume/prepared-volume-runtime.test.mts | 37 +- .../src/volume/prepared-volume-runtime.ts | 21 +- .../telescope-cli/authoring/m45/spitzer.mts | 88 + packages/telescope-cli/authoring/m45/wise.mts | 133 + .../world/pleiades-world-frame.test.mts | 15 + .../application-world-resources.mts | 13 +- src/objects/alcyone/inventory.json | 2 +- src/objects/alcyone/object.json | 8 +- .../alcyone/source/plane-placement.json | 14 + .../source/preparation/new-object.json | 7 +- src/objects/celaeno/inventory.json | 2 +- src/objects/celaeno/object.json | 8 +- .../celaeno/source/plane-placement.json | 14 + .../source/preparation/new-object.json | 7 +- src/objects/m45-named-stars/README.md | 12 +- src/objects/m45-named-stars/inventory.json | 4 +- .../m45-named-stars/source/dots/points.json | 13 +- .../m45-named-stars/source/manifest.json | 23 + .../source/plane-placement.json | 69 + .../m45-named-stars/source/presentation.json | 8 +- src/objects/m45/README.md | 41 +- src/objects/m45/inventory.json | 18 +- src/objects/m45/object.json | 6 +- src/objects/m45/source/content/object.json | 12 +- .../m45/source/presentation/solar-system.json | 2 +- src/objects/m45/text.json | 94 +- src/objects/merope/inventory.json | 4 +- src/objects/merope/object.json | 8 +- .../merope/source/plane-placement.json | 14 + .../merope/source/preparation/new-object.json | 7 +- src/objects/milky-way-pleiades-dust/README.md | 56 + .../milky-way-pleiades-dust/inventory.json | 89 + .../milky-way-pleiades-dust/object.json | 50 + .../source/depth-profiles.json | 32790 ++++++++++++++++ .../source/manifest.json | 496 + .../milky-way-pleiades-dust/source/model.json | 8 + .../source/optical-reference.json | 103 + .../source/parameters.json | 223 + .../source/placement-constraint.json | 55 + src/objects/milky-way/inventory.json | 4 +- .../observable-universe/inventory.json | 4 +- src/objects/pleione/inventory.json | 8 +- src/objects/pleione/object.json | 8 +- .../pleione/source/plane-placement.json | 14 + .../source/preparation/new-object.json | 7 +- src/sources/allwise-pleiades-infrared.json | 31 + src/sources/draine-2021-mmmp-isrf.json | 36 + ...on-nordsieck-2003-pleiades-photometry.json | 36 + src/sources/iras-iris-100um-pleiades.json | 36 + src/sources/noirlab-noao-m45.json | 52 + src/sources/spitzer-mips-pleiades-58.json | 31 + 125 files changed, 37746 insertions(+), 274 deletions(-) create mode 100644 packages/bake/authoring/m45/dust/README.md create mode 100644 packages/bake/authoring/m45/dust/acquisition/edenhofer.mts create mode 100644 packages/bake/authoring/m45/dust/acquisition/named-star-table.mts create mode 100644 packages/bake/authoring/m45/dust/atlas/pack.mts create mode 100644 packages/bake/authoring/m45/dust/atlas/pack.test.mts create mode 100644 packages/bake/authoring/m45/dust/bake.mts create mode 100644 packages/bake/authoring/m45/dust/column/compact-clean.mts create mode 100644 packages/bake/authoring/m45/dust/column/fit.mts create mode 100644 packages/bake/authoring/m45/dust/column/intake.mts create mode 100644 packages/bake/authoring/m45/dust/column/load-cube.mts create mode 100644 packages/bake/authoring/m45/dust/column/map.mts create mode 100644 packages/bake/authoring/m45/dust/column/prepare.mts create mode 100644 packages/bake/authoring/m45/dust/column/types.mts create mode 100644 packages/bake/authoring/m45/dust/field/density.mts create mode 100644 packages/bake/authoring/m45/dust/field/depth-prior.mts create mode 100644 packages/bake/authoring/m45/dust/field/foreground.mts create mode 100644 packages/bake/authoring/m45/dust/field/foreground.test.mts create mode 100644 packages/bake/authoring/m45/dust/field/grid.mts create mode 100644 packages/bake/authoring/m45/dust/field/prepare-depth-record.mts create mode 100644 packages/bake/authoring/m45/dust/field/transmission.mts create mode 100644 packages/bake/authoring/m45/dust/geometry/patches.mts create mode 100644 packages/bake/authoring/m45/dust/geometry/reference.mts create mode 100644 packages/bake/authoring/m45/dust/geometry/windows.mts create mode 100644 packages/bake/authoring/m45/dust/geometry/windows.test.mts create mode 100644 packages/bake/authoring/m45/dust/install-transaction.mts create mode 100644 packages/bake/authoring/m45/dust/install-transaction.test.mts create mode 100644 packages/bake/authoring/m45/dust/install.mts create mode 100644 packages/bake/authoring/m45/dust/panorama/geometry.mts create mode 100644 packages/bake/authoring/m45/dust/panorama/guard.mts create mode 100644 packages/bake/authoring/m45/dust/panorama/integrate.mts create mode 100644 packages/bake/authoring/m45/dust/panorama/seams.mts create mode 100644 packages/bake/authoring/m45/dust/panorama/seams.test.mts create mode 100644 packages/bake/authoring/m45/dust/physics/config.mts create mode 100644 packages/bake/authoring/m45/dust/physics/illumination.mts create mode 100644 packages/bake/authoring/m45/dust/physics/isrf.mts create mode 100644 packages/bake/authoring/m45/dust/physics/types.mts create mode 100644 packages/bake/authoring/m45/dust/tsconfig.json create mode 100644 packages/objects/src/prepared-data/catalogue/point-transmission.ts create mode 100644 packages/renderer/src/styles/volume-clip.test.mts create mode 100644 packages/renderer/src/universe/clouds/cloud-overlay-reader.test.ts create mode 100644 packages/renderer/src/universe/clouds/dataset-cloud-overlays.ts create mode 100644 packages/renderer/src/universe/points/point-transmission-reader.ts create mode 100644 packages/renderer/src/universe/points/point-transmission-transport.ts create mode 100644 packages/renderer/src/universe/points/prepared-transmission.test.ts create mode 100644 packages/renderer/src/universe/points/prepared-transmission.ts create mode 100644 packages/telescope-cli/authoring/m45/spitzer.mts create mode 100644 packages/telescope-cli/authoring/m45/wise.mts create mode 100644 site/build/prepare/world/pleiades-world-frame.test.mts create mode 100644 src/objects/alcyone/source/plane-placement.json create mode 100644 src/objects/celaeno/source/plane-placement.json create mode 100644 src/objects/m45-named-stars/source/plane-placement.json create mode 100644 src/objects/merope/source/plane-placement.json create mode 100644 src/objects/milky-way-pleiades-dust/README.md create mode 100644 src/objects/milky-way-pleiades-dust/inventory.json create mode 100644 src/objects/milky-way-pleiades-dust/object.json create mode 100644 src/objects/milky-way-pleiades-dust/source/depth-profiles.json create mode 100644 src/objects/milky-way-pleiades-dust/source/manifest.json create mode 100644 src/objects/milky-way-pleiades-dust/source/model.json create mode 100644 src/objects/milky-way-pleiades-dust/source/optical-reference.json create mode 100644 src/objects/milky-way-pleiades-dust/source/parameters.json create mode 100644 src/objects/milky-way-pleiades-dust/source/placement-constraint.json create mode 100644 src/objects/pleione/source/plane-placement.json create mode 100644 src/sources/allwise-pleiades-infrared.json create mode 100644 src/sources/draine-2021-mmmp-isrf.json create mode 100644 src/sources/gibson-nordsieck-2003-pleiades-photometry.json create mode 100644 src/sources/iras-iris-100um-pleiades.json create mode 100644 src/sources/noirlab-noao-m45.json create mode 100644 src/sources/spitzer-mips-pleiades-58.json diff --git a/.gitignore b/.gitignore index 86dde55ca7c..0cc51da5984 100644 --- a/.gitignore +++ b/.gitignore @@ -560,3 +560,6 @@ src/objects/proxima-centauri-b/source/science/del-genio-2019/18_Day-Land_ANN1490 # Compressed accepted pre-slice galaxy inputs are restored from the source cache. /src/objects/milky-way-volume/source/b30-inputs/ + +# Numerical Pleiades model inputs restored from the declared source mirror. +/src/objects/milky-way-pleiades-dust/source/inputs/ diff --git a/packages/astronomy/data/bodies/alcyone.json b/packages/astronomy/data/bodies/alcyone.json index e74c6514fb5..908976d3240 100644 --- a/packages/astronomy/data/bodies/alcyone.json +++ b/packages/astronomy/data/bodies/alcyone.json @@ -1,30 +1,30 @@ { - "id": "alcyone", - "classification": "star", - "order": 5469, - "physical": { - "name": "Alcyone", - "horizonsCode": null, - "meanRadiusKm": 10444544.1, - "gravitationalParameterKm3PerS2": 0, - "parent": null, - "effectiveTemperatureK": 8392 - }, - "physicalNotes": "Radius 15.013 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17702: radius 13.762 solar radii, implied by the fitted luminosity 843.922 solar luminosities (fractional uncertainty 0.91) and temperature; scaled from the paper's distance, 123.609 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 13.762 x 134.84/123.609 = 15.013 solar radii (luminosity 1004.3) (https://doi.org/10.1093/mnras/stx1433): 10,444,544 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 8392 +/- 4070 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17702: effective temperature 8392 +/- 4070 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.113) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", - "star": { - "rightAscensionDegrees": 56.87125084725649, - "declinationDegrees": 24.10493447522506, - "positionEpochJulianYear": 2016, - "distanceParsecs": 134.84134308, - "properMotionRaMasPerYear": 0, - "properMotionDecMasPerYear": 0, - "radialVelocityKmPerS": 5.4, - "presentationUp": "display-axis", - "sources": { - "position": "Gaia DR3 source 66714384142368256 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/alcyone/source/photometry/gaia-dr3-source.csv; cross-identification HD 23630, HR 1165, HIP 17702: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+66714384142368256", - "distance": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Alcyone is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 123.609 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased (https://doi.org/10.1051/0004-6361/202346285): 134.84134308 +/- 2.7 pc; Gaia DR3 gives this source no parallax (a two-parameter solution)", - "properMotion": "Gaia DR3 source 66714384142368256 is a two-parameter solution with no proper motion; zero is assumed (at 135 pc, 1 mas/yr would be 1 km/s across the sky)", - "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 66714384142368256 (quality B), from 2006AstL...32..759G; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/2006AstL...32..759G/abstract)" + "id": "alcyone", + "classification": "star", + "order": 5469, + "physical": { + "name": "Alcyone", + "horizonsCode": null, + "meanRadiusKm": 10444544.1, + "gravitationalParameterKm3PerS2": 0, + "parent": null, + "effectiveTemperatureK": 8392 + }, + "physicalNotes": "Radius 15.013 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17702: radius 13.762 solar radii, implied by the fitted luminosity 843.922 solar luminosities (fractional uncertainty 0.91) and temperature; scaled from the paper's distance, 123.609 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 13.762 x 134.84/123.609 = 15.013 solar radii (luminosity 1004.3) (https://doi.org/10.1093/mnras/stx1433): 10,444,544 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 8392 +/- 4070 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17702: effective temperature 8392 +/- 4070 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.113) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", + "star": { + "rightAscensionDegrees": 56.87125084725649, + "declinationDegrees": 24.10493447522506, + "positionEpochJulianYear": 2016, + "distanceParsecs": 136.70063620969086, + "properMotionRaMasPerYear": 0, + "properMotionDecMasPerYear": 0, + "radialVelocityKmPerS": 5.4, + "presentationUp": "display-axis", + "sources": { + "position": "Gaia DR3 source 66714384142368256 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/alcyone/source/photometry/gaia-dr3-source.csv; cross-identification HD 23630, HR 1165, HIP 17702: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+66714384142368256", + "distance": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate. Published cluster reference distance and original photometric radius calibration remain in src/objects/alcyone/source/measurements.json.", + "properMotion": "Gaia DR3 source 66714384142368256 is a two-parameter solution with no proper motion; zero is assumed (at 135 pc, 1 mas/yr would be 1 km/s across the sky)", + "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 66714384142368256 (quality B), from 2006AstL...32..759G; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/2006AstL...32..759G/abstract)" + } } - } } diff --git a/packages/astronomy/data/bodies/celaeno.json b/packages/astronomy/data/bodies/celaeno.json index b5f011a6582..bac36948510 100644 --- a/packages/astronomy/data/bodies/celaeno.json +++ b/packages/astronomy/data/bodies/celaeno.json @@ -1,30 +1,30 @@ { - "id": "celaeno", - "classification": "star", - "order": 5514, - "physical": { - "name": "Celaeno", - "horizonsCode": null, - "meanRadiusKm": 2385755, - "gravitationalParameterKm3PerS2": 445401130385.0343, - "parent": null, - "effectiveTemperatureK": 11577 - }, - "physicalNotes": "Radius 3.429 (3.353 to 3.507) from Gaia DR3 FLAME (Creevey et al. 2023, A&A 674, A26; astrophysical_parameters of the same source): 2,385,755 km at 695,700 km per solar radius. Mass 3.356 (3.313 to 3.399) from Gaia DR3 FLAME (Creevey et al. 2023, A&A 674, A26; astrophysical_parameters of the same source); GM is that mass times the JPL solar GM. Temperature 11577 +/- 36.7 K from Andrae et al. (2023), A&A 674, A27 (Gaia DR3 GSP-Phot), astrophysical_parameters of Gaia DR3 65287458566524928: teff_gspphot 11576.752 K (16th-84th percentiles 11538.454-11611.823), the temperature FLAME used (https://doi.org/10.1051/0004-6361/202243462). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", - "star": { - "rightAscensionDegrees": 56.20099235353907, - "declinationDegrees": 24.28926774500748, - "positionEpochJulianYear": 2016, - "distanceParsecs": 134.84134308, - "properMotionRaMasPerYear": 19.84914439143686, - "properMotionDecMasPerYear": -44.96559622643841, - "radialVelocityKmPerS": 16.494202, - "presentationUp": "display-axis", - "sources": { - "position": "Gaia DR3 source 65287458566524928 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/celaeno/source/photometry/gaia-dr3-source.csv; cross-identification HD 23288, HR 1140, HIP 17489: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+65287458566524928", - "distance": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Celaeno is a member, as its sisters are placed; its own Gaia DR3 parallax agrees to 0.6 pc, within the cluster's depth (half its members within 2.70 pc of the centre) (https://doi.org/10.1051/0004-6361/202346285): 134.84134308 +/- 2.7 pc; Gaia DR3 parallax 7.3852 +/- 0.0724 mas (same row, RUWE 0.96), 102.0 standard errors, is not used", - "properMotion": "Gaia DR3 (same row): 19.849, -44.966 mas/yr", - "radialVelocity": "Gaia DR3 (same row): 16.49 +/- 0.82 km/s" + "id": "celaeno", + "classification": "star", + "order": 5514, + "physical": { + "name": "Celaeno", + "horizonsCode": null, + "meanRadiusKm": 2385755, + "gravitationalParameterKm3PerS2": 445401130385.0343, + "parent": null, + "effectiveTemperatureK": 11577 + }, + "physicalNotes": "Radius 3.429 (3.353 to 3.507) from Gaia DR3 FLAME (Creevey et al. 2023, A&A 674, A26; astrophysical_parameters of the same source): 2,385,755 km at 695,700 km per solar radius. Mass 3.356 (3.313 to 3.399) from Gaia DR3 FLAME (Creevey et al. 2023, A&A 674, A26; astrophysical_parameters of the same source); GM is that mass times the JPL solar GM. Temperature 11577 +/- 36.7 K from Andrae et al. (2023), A&A 674, A27 (Gaia DR3 GSP-Phot), astrophysical_parameters of Gaia DR3 65287458566524928: teff_gspphot 11576.752 K (16th-84th percentiles 11538.454-11611.823), the temperature FLAME used (https://doi.org/10.1051/0004-6361/202243462). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", + "star": { + "rightAscensionDegrees": 56.20099235353907, + "declinationDegrees": 24.28926774500748, + "positionEpochJulianYear": 2016, + "distanceParsecs": 136.7046517908677, + "properMotionRaMasPerYear": 19.84914439143686, + "properMotionDecMasPerYear": -44.96559622643841, + "radialVelocityKmPerS": 16.494202, + "presentationUp": "display-axis", + "sources": { + "position": "Gaia DR3 source 65287458566524928 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/celaeno/source/photometry/gaia-dr3-source.csv; cross-identification HD 23288, HR 1140, HIP 17489: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+65287458566524928", + "distance": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate. Published cluster reference distance and original photometric radius calibration remain in src/objects/celaeno/source/measurements.json.", + "properMotion": "Gaia DR3 (same row): 19.849, -44.966 mas/yr", + "radialVelocity": "Gaia DR3 (same row): 16.49 +/- 0.82 km/s" + } } - } } diff --git a/packages/astronomy/data/bodies/merope.json b/packages/astronomy/data/bodies/merope.json index 481e9643cde..3e9a8600f05 100644 --- a/packages/astronomy/data/bodies/merope.json +++ b/packages/astronomy/data/bodies/merope.json @@ -1,30 +1,30 @@ { - "id": "merope", - "classification": "star", - "order": 5617, - "physical": { - "name": "Merope", - "horizonsCode": null, - "meanRadiusKm": 6235559.1, - "gravitationalParameterKm3PerS2": 0, - "parent": null, - "effectiveTemperatureK": 7913 - }, - "physicalNotes": "Radius 8.963 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17608: radius 7.747 solar radii, implied by the fitted luminosity 211.434 solar luminosities (fractional uncertainty 0.783) and temperature; scaled from the paper's distance, 116.55 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 7.747 x 134.84/116.55 = 8.963 solar radii (luminosity 283.0) (https://doi.org/10.1093/mnras/stx1433): 6,235,559 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 7913 +/- 3358 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17608: effective temperature 7913 +/- 3358 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.448) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", - "star": { - "rightAscensionDegrees": 56.58167144917715, - "declinationDegrees": 23.94814381017594, - "positionEpochJulianYear": 2016, - "distanceParsecs": 134.84134308, - "properMotionRaMasPerYear": 13.075219935615861, - "properMotionDecMasPerYear": -48.403789627642766, - "radialVelocityKmPerS": 6.2, - "presentationUp": "display-axis", - "sources": { - "position": "Gaia DR3 source 65205373152172032 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/merope/source/photometry/gaia-dr3-source.csv; cross-identification HD 23480, HR 1156, HIP 17608: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+65205373152172032", - "distance": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Merope is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 116.55 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased (https://doi.org/10.1051/0004-6361/202346285): 134.84134308 +/- 2.7 pc; Gaia DR3 parallax 7.0670 +/- 0.2862 mas (same row, RUWE 2.33), 24.7 standard errors, is not used", - "properMotion": "Gaia DR3 (same row): 13.075, -48.404 mas/yr", - "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 65205373152172032 (quality E), from 1953GCRV..C......0W; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/1953GCRV..C......0W/abstract)" + "id": "merope", + "classification": "star", + "order": 5617, + "physical": { + "name": "Merope", + "horizonsCode": null, + "meanRadiusKm": 6235559.1, + "gravitationalParameterKm3PerS2": 0, + "parent": null, + "effectiveTemperatureK": 7913 + }, + "physicalNotes": "Radius 8.963 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17608: radius 7.747 solar radii, implied by the fitted luminosity 211.434 solar luminosities (fractional uncertainty 0.783) and temperature; scaled from the paper's distance, 116.55 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 7.747 x 134.84/116.55 = 8.963 solar radii (luminosity 283.0) (https://doi.org/10.1093/mnras/stx1433): 6,235,559 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 7913 +/- 3358 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17608: effective temperature 7913 +/- 3358 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.448) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", + "star": { + "rightAscensionDegrees": 56.58167144917715, + "declinationDegrees": 23.94814381017594, + "positionEpochJulianYear": 2016, + "distanceParsecs": 136.70070226971004, + "properMotionRaMasPerYear": 13.075219935615861, + "properMotionDecMasPerYear": -48.403789627642766, + "radialVelocityKmPerS": 6.2, + "presentationUp": "display-axis", + "sources": { + "position": "Gaia DR3 source 65205373152172032 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/merope/source/photometry/gaia-dr3-source.csv; cross-identification HD 23480, HR 1156, HIP 17608: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+65205373152172032", + "distance": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate. Published cluster reference distance and original photometric radius calibration remain in src/objects/merope/source/measurements.json.", + "properMotion": "Gaia DR3 (same row): 13.075, -48.404 mas/yr", + "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 65205373152172032 (quality E), from 1953GCRV..C......0W; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/1953GCRV..C......0W/abstract)" + } } - } } diff --git a/packages/astronomy/data/bodies/pleione.json b/packages/astronomy/data/bodies/pleione.json index 763d8ba63b8..afdd9be66fc 100644 --- a/packages/astronomy/data/bodies/pleione.json +++ b/packages/astronomy/data/bodies/pleione.json @@ -1,30 +1,30 @@ { - "id": "pleione", - "classification": "star", - "order": 5668, - "physical": { - "name": "Pleione", - "horizonsCode": null, - "meanRadiusKm": 4562400.6, - "gravitationalParameterKm3PerS2": 0, - "parent": null, - "effectiveTemperatureK": 7548 - }, - "physicalNotes": "Radius 6.558 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17851: radius 5.695 solar radii, implied by the fitted luminosity 94.567 solar luminosities (fractional uncertainty 0.602) and temperature; scaled from the paper's distance, 117.096 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 5.695 x 134.84/117.096 = 6.558 solar radii (luminosity 125.4); scaled from the paper's distance, 117.096 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 5.695 x 134.84/117.096 = 6.558 solar radii (luminosity 125.4) (https://doi.org/10.1093/mnras/stx1433): 4,562,401 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 7548 +/- 2496 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17851: effective temperature 7548 +/- 2496 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.495) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", - "star": { - "rightAscensionDegrees": 57.296830774548276, - "declinationDegrees": 24.136498420483132, - "positionEpochJulianYear": 2016, - "distanceParsecs": 134.84134308, - "properMotionRaMasPerYear": 19.49605376673818, - "properMotionDecMasPerYear": -47.64989929604236, - "radialVelocityKmPerS": 5.1, - "presentationUp": "display-axis", - "sources": { - "position": "Gaia DR3 source 66529975427235712 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/pleione/source/photometry/gaia-dr3-source.csv; cross-identification HD 23862, HR 1180, HIP 17851: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+66529975427235712", - "distance": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Pleione is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 117.096 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased (https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114): 134.84134308 +/- 2.7 pc; Gaia DR3 parallax 7.2414 +/- 0.1255 mas (same row, RUWE 1.30), 57.7 standard errors, is not used", - "properMotion": "Gaia DR3 (same row): 19.496, -47.650 mas/yr", - "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 66529975427235712 (quality A), from 2006AstL...32..759G; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/2006AstL...32..759G/abstract)" + "id": "pleione", + "classification": "star", + "order": 5668, + "physical": { + "name": "Pleione", + "horizonsCode": null, + "meanRadiusKm": 4562400.6, + "gravitationalParameterKm3PerS2": 0, + "parent": null, + "effectiveTemperatureK": 7548 + }, + "physicalNotes": "Radius 6.558 solar radii from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17851: radius 5.695 solar radii, implied by the fitted luminosity 94.567 solar luminosities (fractional uncertainty 0.602) and temperature; scaled from the paper's distance, 117.096 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 5.695 x 134.84/117.096 = 6.558 solar radii (luminosity 125.4); scaled from the paper's distance, 117.096 pc, to the cluster's, 134.84 pc: at a fixed temperature the radius grows with the distance, so 5.695 x 134.84/117.096 = 6.558 solar radii (luminosity 125.4) (https://doi.org/10.1093/mnras/stx1433): 4,562,401 km at 695,700 km per solar radius. No mass is measured, so GM is 0, the records' unpublished value. Temperature 7548 +/- 2496 K from McDonald, Zijlstra & Watson (2017), MNRAS 471, 770, table 2, HIP 17851: effective temperature 7548 +/- 2496 K, from the fit of a model atmosphere to the star's spectral energy distribution (goodness of fit Q 0.495) (https://doi.org/10.1093/mnras/stx1433). presentationUp: the display axis is a sky-plane convention; the spin axis's position angle on the sky is not measured.", + "star": { + "rightAscensionDegrees": 57.296830774548276, + "declinationDegrees": 24.136498420483132, + "positionEpochJulianYear": 2016, + "distanceParsecs": 136.70661994364193, + "properMotionRaMasPerYear": 19.49605376673818, + "properMotionDecMasPerYear": -47.64989929604236, + "radialVelocityKmPerS": 5.1, + "presentationUp": "display-axis", + "sources": { + "position": "Gaia DR3 source 66529975427235712 (Gaia Collaboration 2023, A&A 674, A1), ICRS at epoch J2016.0, from the archived row src/objects/pleione/source/photometry/gaia-dr3-source.csv; cross-identification HD 23862, HR 1180, HIP 17851: https://simbad.cds.unistra.fr/simbad/sim-id?Ident=Gaia+DR3+66529975427235712", + "distance": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate. Published cluster reference distance and original photometric radius calibration remain in src/objects/pleione/source/measurements.json.", + "properMotion": "Gaia DR3 (same row): 19.496, -47.650 mas/yr", + "radialVelocity": "SIMBAD's radial velocity for Gaia DR3 66529975427235712 (quality A), from 2006AstL...32..759G; Gaia DR3 measures none (https://ui.adsabs.harvard.edu/abs/2006AstL...32..759G/abstract)" + } } - } } diff --git a/packages/bake/authoring/m45/dust/README.md b/packages/bake/authoring/m45/dust/README.md new file mode 100644 index 00000000000..8d337a2b510 --- /dev/null +++ b/packages/bake/authoring/m45/dust/README.md @@ -0,0 +1,37 @@ +# Pleiades dust preparation + +These TypeScript generators prepare the [Pleiades regional dust model](../../../../../src/objects/milky-way-pleiades-dust/README.md). Its README holds the sources, measured constraints, evidence and known problems. + +## Model and inputs + +- `column/` prepares the infrared column: registered AllWISE and Spitzer bands, compact-source removal, a common beam and a global heating-template fit. The preserved column is conditional on that heating prior, rather than a unique dust-mass measurement. +- `field/` distributes the column along registered Edenhofer profiles, applies luminosity-scaled radiation-pressure cavities and prepares stellar transmission. `source/depth-profiles.json` retains 32,657 native-extracted Float32 samples exactly; their widths include reconstruction uncertainty. +- `physics/` calculates inverse-square stellar illumination, Draine extinction/albedo/Henyey–Greenstein scattering and the published modified-MMP U = 1 Galactic field. Six incoming directions approximate diffuse shielding. +- `geometry/` places finite cloud representatives at emissivity-weighted depths using the fixed reference camera and display parameters in `source/parameters.json`. +- `atlas/` packs the foreground cells with four-pixel gutters, transparent-edge RGB dilation and exact lossless WebP. `panorama/` integrates the remaining Galactic-only light and feathers six expanded faces by normalized optical depth. + +The foreground elements retain one position, image and illumination from every camera direction. The wide cirrus is a rigid panorama; its display radius approximates distant sky. The full density field retains its own coordinates for stellar transmission. The runtime uses the existing cloud-points and fixed-image volume renderers, with source-over composition. + +## Restore, bake and install + +From the repository root, the source mirror restores the numerical inputs declared in the regional manifest. The complete model can be rebaked without the original local research runs. Runtime setup and scientific source restoration are separate operations. + +```sh +pnpm install --frozen-lockfile +pnpm setup:assets --object=milky-way-pleiades-dust +node packages/bake/cli/restore-source-inputs.mts --object=milky-way-pleiades-dust +node packages/bake/authoring/m45/dust/bake.mts --pilot +node packages/bake/authoring/m45/dust/install.mts --pilot +node packages/bake/authoring/m45/dust/bake.mts +node packages/bake/authoring/m45/dust/install.mts +``` + +The small bake uses the same producer and parameters, selecting two foreground cells and a single observer row for transmission; the panorama retains all six faces so its joins can be checked. Installation validates completion and immutable single-frame support before updating the inventory. Intermediate images, records and timing traces stay in ignored local storage. Publication follows the shared maintainer guide. + +Re-extracting the native Edenhofer products requires the cached native radial/HEALPix row extracts and the healpy/NumPy environment used by `acquisition/edenhofer.mts`. Infrared archive acquisition belongs to `packages/telescope-cli/authoring/m45/wise.mts` and `spitzer.mts`; their calibration and fitting are distinct from rebaking the preserved registered column. `acquisition/named-star-table.mts --check` checks the adopted 136.7 pc bright-star plane against measured sky positions. + +## Checks and limits + +Focused tests cover atlas colors/encoding, panorama support and fixed-ray geometry, foreground selection and optical-depth window conservation. Renderer-state tests check retained element identity, positions and immutable lighting. These establish data and projection behavior, not hardware frame delivery. + +The field does not uniquely determine mass or true thickness. Cavity grain and flow parameters are adopted. Fixed Earth-reference lighting and finite billboards approximate other viewpoints. Device measurements show a drag deficit, variable iPad coast slowdown and faint straight-edged dark boundaries in the native iPad Earth view; the regional README links the evidence. diff --git a/packages/bake/authoring/m45/dust/acquisition/edenhofer.mts b/packages/bake/authoring/m45/dust/acquisition/edenhofer.mts new file mode 100644 index 00000000000..54f66cf433d --- /dev/null +++ b/packages/bake/authoring/m45/dust/acquisition/edenhofer.mts @@ -0,0 +1,56 @@ +import { spawn } from 'node:child_process'; +import { resolve } from 'node:path'; +// Native HEALPix interpolation stays with healpy/NumPy, as in the repository's other astronomy preparation owners. +const python = String.raw` +import json,os,time +from pathlib import Path +import numpy as np,healpy as hp,requests +W=Path('.local'); output=Path('src/objects/milky-way-pleiades-dust/source/inputs'); C=np.array(json.loads((output/'wide-science-grid.json').read_text())['centerGalacticPc']) +rad=np.frombuffer((W/'ranges/edenhofer-3246405120-2064.bin').read_bytes(),'>f4').astype(float) +lo=np.array([-140.,-100.,-100.]); hi=np.array([50.,100.,100.]); step=1. +corners=np.array(np.meshgrid(*[(C[a]+lo[a],C[a]+hi[a]) for a in range(3)],indexing='ij')).reshape(3,-1).T +end=int(np.searchsorted(rad,np.linalg.norm(corners,axis=1).max()))+2 +row=786432*4; path=W/'edenhofer-wide-native-mean.f32'; expected=end*row +if not path.exists(): + with path.open('wb') as f:f.truncate(expected) +done=set(json.loads((W/'wide-native-completed.json').read_text()) if (W/'wide-native-completed.json').exists() else []) +# Reuse the original full-sky shell block, without acquiring or inventing another dust product. +old=W/'ranges/edenhofer-239081088-261095424.bin'; first=(239081088-5760)//row; oldcount=261095424//row +if old.exists() and 'original' not in done: + with path.open('r+b') as f:f.seek(first*row);f.write(old.read_bytes()) + done.add('original') +session=requests.Session(); fetched=0; started=time.monotonic() +chunks=[(a,min(a+16,end,first)) for a in range(0,first,16)]+[(a,min(a+16,end)) for a in range(first+oldcount,end,16)] +for a,b in chunks: + key=f'{a}:{b}' + if a>=b or key in done:continue + start=5760+a*row; size=(b-a)*row + assert fetched+size<800_000_000 + response=session.get('https://zenodo.org/records/10658339/files/mean_and_std_healpix.fits',headers={'Range':f'bytes={start}-{start+size-1}'},timeout=(15,60)) + response.raise_for_status(); assert response.status_code==206 and response.headers.get('Content-Range','').startswith(f'bytes {start}-') + assert len(response.content)==size + with path.open('r+b') as f:f.seek(a*row);f.write(response.content) + done.add(key);(W/'wide-native-completed.json').write_text(json.dumps(sorted(done))) + fetched+=size;print('NATIVE_ROWS_READY',a,b,'newBytes',fetched,'seconds',round(time.monotonic()-started,1),flush=True) +raw=np.memmap(path,dtype='>f4',mode='r',shape=(end,786432)) +shape=np.rint((hi-lo)/step).astype(int)+1 +target=np.memmap(output/'edenhofer-wide-density.f32',dtype='=rad[0] and r.max()0) and np.all(b>0) + value=np.exp((1-f)*np.sum(np.log(a)*weights,axis=0)+f*np.sum(np.log(b)*weights,axis=0))*2.8/(2.5/np.log(10)) + target[x]=value.reshape(yy.shape);minimum=min(minimum,float(value.min()));maximum=max(maximum,float(value.max())) + if x%32==0:print('NATIVE_GRID_READY',x,int(shape[0]),flush=True) +target.flush() +record={'source':'Edenhofer v1.0.2 native mean_and_std_healpix.fits','quantity':'V optical depth per pc','originGalacticPc':(C+lo).tolist(),'centerGalacticPc':C.tolist(),'boundsUnits':{'min':lo.tolist(),'max':hi.tolist()},'stepPc':step,'shape':shape.tolist(),'angularInterpolation':'healpy HEALPix NEST log-density; linear between native radial coordinates','minTauVPerPc':minimum,'maxTauVPerPc':maximum,'newlyAcquiredBytes':fetched,'seconds':time.monotonic()-started} +(output/'wide-science-grid.json').write_text(json.dumps(record,indent=2));print('WIDE_NATIVE_GRID_COMPLETE',json.dumps(record),flush=True) +`; +const child = spawn(resolve('.local/science-env/bin/python'), ['-u', '-c', python], { stdio: 'inherit' }); +const status = await new Promise((done, reject) => { child.once('error', reject);child.once('exit', done); }); +if (status !== 0) throw new Error(`Native acquisition exited ${status}.`); diff --git a/packages/bake/authoring/m45/dust/acquisition/named-star-table.mts b/packages/bake/authoring/m45/dust/acquisition/named-star-table.mts new file mode 100644 index 00000000000..a61a37015f1 --- /dev/null +++ b/packages/bake/authoring/m45/dust/acquisition/named-star-table.mts @@ -0,0 +1,30 @@ +/** Reproduce the adopted table only; the historical world-frame installation remains separately recorded. */ +import assert from 'node:assert/strict'; +import { readFile, writeFile } from 'node:fs/promises'; +import { resolve } from 'node:path'; +import { requireArray, requireFiniteNumber, requireRecord, requireString } from '@cssearth/core'; + +const directory = resolve('src/objects/m45-named-stars'); +const placement = requireRecord(JSON.parse(await readFile(resolve(directory, 'source/plane-placement.json'), 'utf8'))); +const [ra, dec] = requireArray(placement.referenceDirectionIcrsDegrees).map(v => requireFiniteNumber(v)); +assert.equal(requireArray(placement.referenceDirectionIcrsDegrees).length, 2); +const starDepth = requireFiniteNumber(placement.starNormalDepthPc); +const direction = (r: number, d: number) => [Math.cos(d * Math.PI / 180) * Math.cos(r * Math.PI / 180), + Math.cos(d * Math.PI / 180) * Math.sin(r * Math.PI / 180), Math.sin(d * Math.PI / 180)]; +const normal = direction(ra!, dec!); +const original = await readFile(resolve(directory, requireString(placement.originalTable)), 'utf8'); +const lines = original.trim().split(/\r?\n/u), header = lines[0]!; +assert.equal(header, 'HIP,RArad,DErad,distpc,Hpmag,B-V'); +const rows = lines.slice(1).map(line => { + const columns = line.split(','), values = columns.map(Number); + assert.equal(values.length, 6); assert.ok(values.every(Number.isFinite)); + // This preserved table's RA/Dec values are degrees despite its historical header names. + const ray = direction(values[1]!, values[2]!), cosine = ray.reduce((sum, value, i) => sum + value * normal[i]!, 0); + assert.ok(cosine > 0); + return columns.map((value, i) => i === 3 ? (starDepth / cosine).toFixed(12) : value).join(','); +}); +assert.equal(rows.length, 9); +const result = [header, ...rows].join('\n') + '\n', target = resolve(directory, requireString(placement.modeledTable)); +if (process.argv.includes('--check')) assert.equal(await readFile(target, 'utf8'), result); +else await writeFile(target, result); +console.log('PLEIADES_NAMED_TABLE_VERIFIED', JSON.stringify({ rows: rows.length, check: process.argv.includes('--check') })); diff --git a/packages/bake/authoring/m45/dust/atlas/pack.mts b/packages/bake/authoring/m45/dust/atlas/pack.mts new file mode 100644 index 00000000000..59c5013d253 --- /dev/null +++ b/packages/bake/authoring/m45/dust/atlas/pack.mts @@ -0,0 +1,52 @@ +import sharp from 'sharp'; + +export interface CloudAtlas { rgba: Uint8Array; width: number; height: number; cells: Uint16Array } + +/** Fill undefined transparent RGB from this tile alone; alpha and active RGB never change. */ +export function dilateTransparentRgb(original: Uint8Array, size: number): Uint8Array { + const rgba = original.slice(), count = size * size, seeds = new Int32Array(count).fill(-1), queue = new Int32Array(count); + let next = 0, length = 0; + for (let p = 0; p < count; p++) if (original[p * 4 + 3]) { seeds[p] = p; queue[length++] = p; } + // Deterministic multi-source8-neighbor flood: nearest seed in Chebyshev distance, + // row-major tie breaking. These colors have zero optical support, not new light. + while (next < length) { + const p = queue[next++]!, x = p % size, y = Math.floor(p / size), seed = seeds[p]!; + for (let dy = -1; dy <= 1; dy++) for (let dx = -1; dx <= 1; dx++) { + if (!dx && !dy) continue; + const sx = x + dx, sy = y + dy; + if (sx < 0 || sy < 0 || sx >= size || sy >= size) continue; + const q = sy * size + sx; + if (seeds[q] !== -1) continue; + seeds[q] = seed; queue[length++] = q; + for (let c = 0; c < 3; c++) rgba[q * 4 + c] = original[seed * 4 + c]!; + } + } + return rgba; +} + +/** Each existing cell retains its native viewport; external gutters isolate its sampling. */ +export function packCloudAtlas(tiles: readonly Uint8Array[], size: number, gutter: number): CloudAtlas { + if (!tiles.length || !Number.isSafeInteger(size) || size < 1 || !Number.isSafeInteger(gutter) || gutter < 1) + throw new Error('Positive tile count, native size and external gutter required'); + if (tiles.some(tile => tile.length !== size * size * 4)) throw new Error('NativeRGBA tile size mismatch'); + const across = Math.ceil(Math.sqrt(tiles.length)), pitch = size + 2 * gutter; + const width = across * pitch, height = Math.ceil(tiles.length / across) * pitch; + if (width > 65535 || height > 65535) throw new Error('Atlas exceeds unsigned16 cell coordinates'); + const rgba = new Uint8Array(width * height * 4), cells = new Uint16Array(tiles.length * 2); + for (const [i, original] of tiles.entries()) { + const tile = dilateTransparentRgb(original, size), left = i % across * pitch + gutter, top = Math.floor(i / across) * pitch + gutter; + cells.set([left, top], i * 2); + for (let y = -gutter; y < size + gutter; y++) for (let x = -gutter; x < size + gutter; x++) { + const sx = Math.max(0, Math.min(size - 1, x)), sy = Math.max(0, Math.min(size - 1, y)); + const source = (sy * size + sx) * 4, target = ((top + y) * width + left + x) * 4; + rgba.set(tile.subarray(source, source + 4), target); + } + } + return { rgba, width, height, cells }; +} + +/** Ordinary straightRGBA. exact preserves edge colors under alpha0 through libwebp. */ +export function encodeCloudAtlas(atlas: CloudAtlas): Promise { + return sharp(atlas.rgba, { raw: { width: atlas.width, height: atlas.height, channels: 4 } }) + .webp({ lossless: true, exact: true }).toBuffer(); +} diff --git a/packages/bake/authoring/m45/dust/atlas/pack.test.mts b/packages/bake/authoring/m45/dust/atlas/pack.test.mts new file mode 100644 index 00000000000..a8c7c7f9cbe --- /dev/null +++ b/packages/bake/authoring/m45/dust/atlas/pack.test.mts @@ -0,0 +1,42 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import sharp from 'sharp'; +import { encodeCloudAtlas, packCloudAtlas } from './pack.mts'; + +test('external gutters isolate the unchanged viewport from unlike neighboring cells', () => { + const size = 4, gutter = 2; + const tiles = [[61, 127, 211, 255], [239, 71, 13, 255]].map(color => { + const tile = new Uint8Array(size * size * 4); + for (let p = 0; p < size * size; p++) tile.set(color, p * 4); + return tile; + }); + const atlas = packCloudAtlas(tiles, size, gutter); + for (let i = 0; i < tiles.length; i++) { + const left = atlas.cells[i * 2]!, top = atlas.cells[i * 2 + 1]!; + assert(left >= gutter && top >= gutter); + // The whole bounded filter footprint must see this cell's own border color. + // Opaque unlike borders ensure that deleting gutters/extrusion fails here. + for (let y = -gutter; y < size + gutter; y++) for (let x = -gutter; x < size + gutter; x++) { + const offset = ((top + y) * atlas.width + left + x) * 4; + assert.deepEqual(atlas.rgba.slice(offset, offset + 4), tiles[i]!.slice(0, 4)); + } + } + assert.throws(() => packCloudAtlas(tiles, size, 0)); +}); + +test('decoded lossless atlas preserves alpha and activeRGBA, with independent transparent edge colors', async () => { + const size = 4, red = new Uint8Array(size * size * 4), blue = red.slice(); + red.set([231, 91, 153, 128], (size + 1) * 4); + blue.set([61, 127, 211, 255], (size * 2 + 2) * 4); + const originals = [red.slice(), blue.slice()], atlas = packCloudAtlas([red, blue], size, 2); + assert.deepEqual([red, blue], originals, 'Packing must not mutate its input'); + const encoded = await encodeCloudAtlas(atlas), decoded = await sharp(encoded).ensureAlpha().raw().toBuffer(); + // Removing exact:true changes hiddenRGB on this fixture; test the encoded file. + assert.deepEqual(new Uint8Array(decoded), atlas.rgba); + for (const [i, original] of originals.entries()) for (let y = 0; y < size; y++) for (let x = 0; x < size; x++) { + const from = (y * size + x) * 4, to = ((atlas.cells[i * 2 + 1]! + y) * atlas.width + atlas.cells[i * 2]! + x) * 4; + assert.equal(decoded[to + 3], original[from + 3]); + if (original[from + 3]) assert.deepEqual([...decoded.subarray(to, to + 4)], [...original.subarray(from, from + 4)]); + else assert.deepEqual([...decoded.subarray(to, to + 3)], i ? [61, 127, 211] : [231, 91, 153]); + } +}); diff --git a/packages/bake/authoring/m45/dust/bake.mts b/packages/bake/authoring/m45/dust/bake.mts new file mode 100644 index 00000000000..d9ed6629a91 --- /dev/null +++ b/packages/bake/authoring/m45/dust/bake.mts @@ -0,0 +1,163 @@ +import { mkdir, writeFile } from 'node:fs/promises'; +import sharp from 'sharp'; +import { requireArray, requireFiniteNumber, requireRecord } from '@cssearth/core'; +import { encodeCloudPoints, readCloudPoints, type PreparedCloudPoints } from '@cssearth/objects'; +import { packPreparedBank } from '@cssearth/objects/node'; +import { createField } from './field/density.mts'; +import {prepareTransmission} from './field/transmission.mts'; +import { prepareTransport } from './physics/illumination.mts'; +import { json, vector } from './field/grid.mts'; +import type { Vec } from './physics/types.mts'; +import { cellBox, cellPart, derivePatchFromDensity, patchPlan, rayBox, referenceProjection, type FixedPatch } from './geometry/patches.mts'; +import { referenceCamera } from './geometry/reference.mts'; +import { patchAxisWeight, quantizedPatchAlpha } from './geometry/windows.mts'; +import { foregroundSelection } from './field/foreground.mts'; +import { prepareWide } from './panorama/integrate.mts'; +import { guardPanorama } from './panorama/guard.mts'; +import { packCloudAtlas,encodeCloudAtlas } from './atlas/pack.mts'; + +const pilot = process.argv.includes('--pilot'), out = pilot ? '.local/pleiades-dust/pilot' : '.local/pleiades-dust/bake'; +const texels = 160, kernel = 'cosine-half-pitch-joint-alpha', started = Date.now(); +await mkdir(out, { recursive: true }); +if (!pilot) { + const previous = await json('.local/pleiades-dust/pilot/record.json'); + if (previous.executionComplete !== true || previous.pilot !== true || previous.texels !== texels || previous.kernel !== kernel) + throw new Error('Matching positive Pleiades pilot required'); +} +const reference = await referenceCamera(), field = await createField(), selection = foregroundSelection(field); +const transport = await prepareTransport(field), light = transport.source([0, 0, -1], selection.earthEye); +const old = await json('src/objects/milky-way-pleiades-dust/source/parameters.json'), oldRows = requireArray(old.cellProjections).map(v => requireRecord(v)); +const display = requireRecord(old.display), gains = vector(display.gains), exposure = requireFiniteNumber(display.exposure); +if (!(exposure > 0) || gains.some(v => !(v > 0))) throw new Error('Positive inherited display required'); +const plan = patchPlan().filter(p => cellBox(p.cell).min[2] < selection.starPlaneZPc && (!pilot || ['core-0-1-1', 'surround-0-0'].includes(p.cell.id))); +interface Raster { data: Uint8Array; width: number; height: number } +interface Sprite { id: string; position: Vec; diameter: number; rgba: Uint8Array; record: Record } +const images = new Map(), sprites: Sprite[] = [], cellRecords: Record[] = []; +const encoded = (v: number) => v <= .0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - .055; +function encode(rgb: Float64Array, rgba: Uint8Array, offset: number): void { + const peak = Math.max(...rgb.map((v, c) => v * gains[c]!)); + if (!(Number.isFinite(peak) && peak >= 0)) throw new Error('Nonphysical radiance'); + const alpha = -Math.expm1(-exposure * peak); + rgba[offset + 3] = Math.round(255 * alpha); + if (!rgba[offset + 3]) return; + for (let c = 0; c < 3; c++) rgba[offset + c] = Math.round(255 * encoded(peak ? Math.min(1, rgb[c]! * gains[c]! / peak) : 0)); +} +function sample(image: Raster, u: number, v: number): [number, number, number, number] { + const x = u * image.width - .5, y = v * image.height - .5, ix = Math.floor(x), iy = Math.floor(y), tx = x - ix, ty = y - iy; + const result = [0, 0, 0, 0]; + for (let j = 0; j < 2; j++) for (let i = 0; i < 2; i++) { + const px = ix + i, py = iy + j; + if (px < 0 || py < 0 || px >= image.width || py >= image.height) continue; + const at = (py * image.width + px) * 4, alpha = image.data[at + 3]! / 255, weight = (i ? tx : 1 - tx) * (j ? ty : 1 - ty); + result[3]! += alpha * weight; + for (let c = 0; c < 3; c++) result[c]! += image.data[at + c]! / 255 * alpha * weight; + } + return [result[3]! ? result[0]! / result[3]! : 0, result[3]! ? result[1]! / result[3]! : 0, result[3]! ? result[2]! / result[3]! : 0, result[3]!]; +} + +for (const patch of plan) { + const p = patch, source = oldRows.find(r => r.cell === p.cell.id); + if (!source) throw new Error('Original projection missing'); + const projection = referenceProjection(p.cell, vector(source.eye), reference.axes, { cameraEye: reference.eye, spanPc: requireFiniteNumber(source.spanPc) }); + let image = images.get(p.cell.id); + if (!image) { + const size = p.cell.kind === 'core' ? 384 : 128, rgba = new Uint8Array(size * size * 4), radiance = new Float32Array(size * size * 3); + const j = new Float64Array(3), sum = new Float64Array(3), box = cellBox(p.cell); + box.max[2] = Math.min(box.max[2], selection.starPlaneZPc); + let nonzero = 0, maxSteps = 0; + for (let y = 0; y < size; y++) for (let x = 0; x < size; x++) { + const ray = projection.bakeRay((x + .5) / size, (y + .5) / size), segment = rayBox(ray, box); + sum.fill(0); + if (segment) { + const steps = Math.ceil((segment[1] - segment[0]) / (p.cell.kind === 'core' ? .04 : .25)), ds = (segment[1] - segment[0]) / steps; + maxSteps = Math.max(maxSteps, steps); + for (let k = 0; k < steps; k++) { + const distance = segment[0] + (k + .5) * ds, at: Vec = ray.eye.map((v, a) => v + ray.direction[a]! * distance) as Vec; + const rho = selection.selected(...at) * cellPart(p.cell, ...at); + if (!rho) continue; + light.at(...at, j); + for (let c = 0; c < 3; c++) sum[c]! += rho * j[c]! * ds; + } + } + const pixel = y * size + x; + radiance.set(sum, pixel * 3); encode(sum, rgba, pixel * 4); + if (rgba[pixel * 4 + 3]) nonzero++; + } + image = { data: rgba, width: size, height: size }; images.set(p.cell.id, image); + await sharp(rgba, { raw: { width: size, height: size, channels: 4 } }).png().toFile(`${out}/${p.cell.id}-earth-foreground.png`); + await writeFile(`${out}/${p.cell.id}-earth-foreground.f32`, Buffer.from(radiance.buffer)); + cellRecords.push({ id: p.cell.id, texels: size, nonzero, maxSteps, eye: projection.bakeEye, lightEye: selection.earthEye, spanPc: projection.spanPc }); + console.log('PLEIADES_FOREGROUND_CELL_COMPLETE', JSON.stringify({ cell: p.cell.id, nonzero, seconds: (Date.now() - started) / 1000 })); + await new Promise(done => setImmediate(done)); + } + const n = p.cell.kind === 'core' ? 3 : 2, ix = Math.round(p.bounds.u0 * n), iy = Math.round(p.bounds.v0 * n), epsilon = .5 / n; + const bounds = { u0: Math.max(0, p.bounds.u0 - epsilon), v0: Math.max(0, p.bounds.v0 - epsilon), u1: Math.min(1, p.bounds.u1 + epsilon), v1: Math.min(1, p.bounds.v1 + epsilon) }; + let minX = image.width, minY = image.height, maxX = -1, maxY = -1; + for (let y = Math.floor(bounds.v0 * image.height); y < Math.ceil(bounds.v1 * image.height); y++) + for (let x = Math.floor(bounds.u0 * image.width); x < Math.ceil(bounds.u1 * image.width); x++) { + if (quantizedPatchAlpha(image.data[(y * image.width + x) * 4 + 3]! / 255, (x + .5) / image.width, (y + .5) / image.height, ix, iy, n)) { + minX = Math.min(minX, x); minY = Math.min(minY, y); maxX = Math.max(maxX, x); maxY = Math.max(maxY, y); + } + } + if (maxX < 0) continue; + bounds.u0 = Math.max(bounds.u0, (minX - 2) / image.width); bounds.v0 = Math.max(bounds.v0, (minY - 2) / image.height); + bounds.u1 = Math.min(bounds.u1, (maxX + 3) / image.width); bounds.v1 = Math.min(bounds.v1, (maxY + 3) / image.height); + let placed: FixedPatch | null = null, rays = 9; + const j = new Float64Array(3), box = cellBox(p.cell); box.max[2] = Math.min(box.max[2], selection.starPlaneZPc); + for (const count of [9, 17, 31]) { + rays = count; + placed = derivePatchFromDensity((x, y, z) => { + const rho = selection.selected(x, y, z) * cellPart(p.cell, x, y, z); + if (!rho) return 0; + light.at(x, y, z, j); return rho * j[1]!; + }, box, projection, bounds, { raysPerAxis: count, maxStepPc: p.cell.kind === 'core' ? .04 : .25, centerMode: 'weighted', weightAtUv: (u, v) => patchAxisWeight(u, ix, n) * patchAxisWeight(v, iy, n) }); + if (placed) break; + } + if (!placed) throw new Error(`Visible foreground patch lacks model support: ${p.id}`); + const rgba = new Uint8Array(texels * texels * 4), m = projection.basisM, det = m[0] * m[3] - m[1] * m[2]; + if (Math.abs(det) < 1e-6) throw new Error('Singular reference display projection'); + const [cx, cy] = projection.displayPlaneXY(...placed.sourceCenterUv), origin = projection.displayPlaneXY(.5, .5), depthScale = placed.cameraDepthPc / projection.cellCameraDepthPc; + let nonzero = 0; + for (let y = 0; y < texels; y++) for (let x = 0; x < texels; x++) { + const dx = (cx + ((x + .5) / texels - .5) * placed.diameterPc / depthScale - origin[0]) / projection.spanPc; + const dy = (cy + ((y + .5) / texels - .5) * placed.diameterPc / depthScale - origin[1]) / projection.spanPc; + const u = .5 + (m[3] * dx - m[2] * dy) / det, v = .5 + (-m[1] * dx + m[0] * dy) / det; + if (u < bounds.u0 || u > bounds.u1 || v < bounds.v0 || v > bounds.v1) continue; + const rgb = sample(image, u, v), at = (y * texels + x) * 4; + rgba[at + 3] = quantizedPatchAlpha(rgb[3], u, v, ix, iy, n); + if (!rgba[at + 3]) continue; + nonzero++; + for (let c = 0; c < 3; c++) rgba[at + c] = Math.round(255 * rgb[c]!); + } + if (!nonzero) continue; + if (!(placed.position[2] > selection.earthEye[2] && placed.position[2] < selection.starPlaneZPc)) throw new Error('Representative escaped selected foreground'); + const record = { id: p.id, parent: p.cell.id, position: placed.position, diameterPc: placed.diameterPc, sourceBounds: bounds, + cameraDepthPc: placed.cameraDepthPc, depthSigmaPc: placed.cameraDepthSigmaPc, sourceCenterUv: placed.sourceCenterUv, + raysPerAxis: rays, nonzero, material: 'One immutable Earth-referenced foreground radiance image; no directional alternative', placement: placed.metadata }; + sprites.push({ id: p.id, position: placed.position, diameter: placed.diameterPc, rgba, record }); + await sharp(rgba, { raw: { width: texels, height: texels, channels: 4 } }).png().toFile(`${out}/${p.id}.png`); +} +if (!sprites.length) throw new Error('No foreground cloud'); +const packedAtlas=packCloudAtlas(sprites.map(s=>s.rgba),texels,4),{width,height,cells}=packedAtlas; +const positions=new Float64Array(sprites.length*3),diameters=new Float32Array(sprites.length); +for(const [i,s]of sprites.entries()){positions.set(s.position,i*3);diameters[i]=s.diameter;} +const bank: PreparedCloudPoints = { id: 'pleiades-earth-foreground', frame: reference.frame, count: sprites.length, positions, diameters, cells, + cellTexels: texels, atlas: 'foreground-cloud-atlas.webp', compositing: 'grouped', occluder: [] }; +const packed = encodeCloudPoints(bank); readCloudPoints(packed); +await writeFile(`${out}/foreground-cloud.bin`, packPreparedBank(packed)); +await writeFile(`${out}/foreground-cloud-atlas.webp`,await encodeCloudAtlas(packedAtlas)); +const native = await prepareWide({ field, transport, frame: reference.frame, out, pilot }); +const wide = await guardPanorama(out,native); +const transmission=await prepareTransmission(field,{pilot}); +const record = { executionComplete: true, pilot, texels, kernel, count: sprites.length, frames: 1, nativePixels: sprites.length * texels ** 2, + atlas: { width, height }, display: { exposure, gains }, referenceEye: reference.eye, referenceAxes: reference.axes, + foreground: selection.metadata, source: 'Single-scattering radiance evaluated once toward the fixed Earth reference, then frozen for every preview camera', + field: field.metadata, transport: transport.metadata, transmission, cells: cellRecords, patches: sprites.map(s => s.record), wide, + limitations: ['Billboards are finite-volume representatives, not rigid cloud surfaces or newly measured filament depths.', + 'Only the selected foreground column contributes cluster reflection; its column is not renormalized.', + 'The full unchanged dust field still attenuates illumination and stars; visible Galactic light is partitioned once over all remaining dust.', + 'Earth-reference scattering and outgoing attenuation remain frozen from other camera positions by the fixed reference model; this is a presentation model.', + 'Geometric behind-camera visibility follows ordinary point projection; it is separate from immutable material lighting.'], + seconds: (Date.now() - started) / 1000 }; +await writeFile(`${out}/record.json`, JSON.stringify(record, null, 2) + '\n'); +console.log('PLEIADES_FIXED_EARTH_CLOUD_COMPLETE', JSON.stringify({ pilot, patches: sprites.length, wide: wide.count, frames: 1, seconds: record.seconds })); diff --git a/packages/bake/authoring/m45/dust/column/compact-clean.mts b/packages/bake/authoring/m45/dust/column/compact-clean.mts new file mode 100644 index 00000000000..c07e64f3d8d --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/compact-clean.mts @@ -0,0 +1,202 @@ +/** Conservative IR-only PSF subtraction before common-beam smoothing. No density is edited here. */ +import { readFile } from 'node:fs/promises'; +import type { SkyProjection } from '@cssearth/fits'; +import { PC, type Inputs, type Star } from '../physics/types.mts'; +import type { IrBand, BandName } from './types.mts'; + +interface Grid { width: number; height: number; projection: SkyProjection; pixelArcsec: number } +interface BandFlux { accepted: boolean; fluxJy: number | null; sigmaJy: number | null } +interface Point { name: string; ra: number; dec: number; W3: BandFlux; W4: BandFlux } +interface Primary { hip: number; names: string[]; ra: number; dec: number } +interface Catalogue { points: Point[]; primaries: Primary[] } +interface ResponseRow { wave: number; qe: number } +interface PsfBudget { requestedFluxJy: number; subtractedFluxJy: number; outsideGridFluxJy: number; unavailableFluxJy: number; reservedCoreFluxJy: number; modifiedPixels: number } +const CATALOGUE = 'src/objects/milky-way-pleiades-dust/source/inputs/wise-points.json'; +const PSF: Record = { WISE3: 9.5, WISE4: 16.8, MIPS24: 6, MIPS70: 18 }; +const RESERVATION_ARCSEC = 36, SOLAR_RADIUS_M = 6.957e8; +const LN2_8_SQRT = Math.sqrt(8 * Math.LN2), ARCSEC_RAD = Math.PI / (180 * 3600); +let cataloguePromise: Promise | undefined; +const responseCache = new Map>(); +const record = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value); +const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value); +function number(value: unknown, name: string): number { if (!finite(value)) throw Error(`Invalid ${name}`); return value; } +function array(value: unknown, name: string): unknown[] { if (!Array.isArray(value)) throw Error(`Invalid ${name}`); return value; } +function position(value: Record): { ra: number; dec: number } { + const ra = number(value.ra, 'RA'), dec = number(value.dec, 'declination'); + if (ra < 0 || ra >= 360 || Math.abs(dec) > 90) throw Error('Point outside celestial coordinate range.'); return { ra, dec }; +} +function parseFlux(value: unknown): BandFlux { + if (!record(value) || typeof value.accepted !== 'boolean') throw Error('Invalid qualified band record.'); + if (!value.accepted) return { accepted: false, fluxJy: null, sigmaJy: null }; + const fluxJy = number(value.fluxJy, 'accepted flux'), sigmaJy = number(value.sigmaFluxJy, 'accepted flux uncertainty'); + if (!(fluxJy > 0) || sigmaJy < 0) throw Error('Accepted source flux/error has an invalid sign.'); + return { accepted: true, fluxJy, sigmaJy }; +} +async function readCatalogue(): Promise { + const raw: unknown = JSON.parse(await readFile(CATALOGUE, 'utf8')); if (!record(raw)) throw Error('Invalid compact-source catalogue.'); + const points = array(raw.points, 'points').map(value => { + if (!record(value) || typeof value.designation !== 'string' || value.ext_flg !== 0) throw Error('Point catalogue is not the qualified ext_flg=0 selection.'); + return { name: value.designation, ...position(value), W3: parseFlux(value.W3), W4: parseFlux(value.W4) }; + }); + const primaries = array(raw.primaryStars, 'primary systems').map(value => { + if (!record(value)) throw Error('Invalid primary star.'); + const hip = number(value.hip, 'HIP'), names = array(value.names, 'primary names').map(name => { if (typeof name !== 'string') throw Error('Invalid primary name.'); return name; }); + if (!Number.isSafeInteger(hip) || hip <= 0 || !names.length) throw Error('Invalid primary identity.'); return { hip, names, ...position(value) }; + }); + if (primaries.length !== 7 || new Set(primaries.map(primary => primary.hip)).size !== 7) throw Error('Seven unique primary systems are required.'); + return { points, primaries }; +} +function validateBand(band: IrBand, grid: Grid): void { + if (!Number.isSafeInteger(grid.width) || !Number.isSafeInteger(grid.height) || grid.width < 1 || grid.height < 1 || !finite(grid.pixelArcsec) || grid.pixelArcsec <= 0 || grid.width * grid.height > 30_000_000) throw Error('Invalid compact-clean grid.'); + const n = grid.width * grid.height; + if (!(band.data instanceof Float32Array) || !(band.variance instanceof Float32Array) || !(band.validity instanceof Uint8Array) || band.data.length !== n || band.variance.length !== n || band.validity.length !== n || !(band.name in PSF)) throw Error('IR band arrays/name do not match the grid.'); + for (let p = 0; p < n; p++) if (band.validity[p] && (!Number.isFinite(band.data[p]) || !Number.isFinite(band.variance[p]) || band.variance[p]! < 0)) throw Error('A valid IR observation has nonfinite data/variance.'); +} + +/** Abramowitz-Stegun erf approximation; pixel-integrated Gaussians, not center-sampled peaks. */ +function erf(value: number): number { + const sign = value < 0 ? -1 : 1, x = Math.abs(value), t = 1 / (1 + .3275911 * x); + const polynomial = (((1.061405429 * t - 1.453152027) * t + 1.421413741) * t - .284496736) * t + .254829592; + return sign * (1 - polynomial * t * Math.exp(-x * x)); +} +function integratedKernel(center: number, sigmaPixel: number): { first: number; weights: number[] } { + const first = Math.floor(center - 6 * sigmaPixel - .5), last = Math.ceil(center + 6 * sigmaPixel + .5), root2Sigma = Math.SQRT2 * sigmaPixel; + const weights: number[] = []; + for (let pixel = first; pixel <= last; pixel++) weights.push(Math.max(0, .5 * (erf((pixel + .5 - center) / root2Sigma) - erf((pixel - .5 - center) / root2Sigma)))); + const sum = weights.reduce((a, b) => a + b, 0); if (!(sum > 0)) throw Error('Empty Gaussian kernel.'); + return { first, weights: weights.map(weight => weight / sum) }; +} +function subtractPsf(band: IrBand, width: number, height: number, pixelArcsec: number, x: number, y: number, fwhmArcsec: number, fluxJy: number, sigmaFluxJy: number, reserved?: Uint8Array): PsfBudget { + if (![x, y, fluxJy, sigmaFluxJy, fwhmArcsec].every(Number.isFinite) || fluxJy < 0 || sigmaFluxJy < 0 || fwhmArcsec <= 0) throw Error('Invalid Gaussian point model.'); + const budget: PsfBudget = { requestedFluxJy: fluxJy, subtractedFluxJy: 0, outsideGridFluxJy: 0, unavailableFluxJy: 0, reservedCoreFluxJy: 0, modifiedPixels: 0 }; + const sigmaPixel = fwhmArcsec / LN2_8_SQRT / pixelArcsec, kernelX = integratedKernel(x, sigmaPixel), kernelY = integratedKernel(y, sigmaPixel); + const jyToMJySrPixel = 1 / ((pixelArcsec * ARCSEC_RAD) ** 2 * 1e6); + // Normalize against the full kernel, including pixels outside the image. Edge sources never gain flux. + for (let j = 0; j < kernelY.weights.length; j++) for (let i = 0; i < kernelX.weights.length; i++) { + const px = kernelX.first + i, py = kernelY.first + j, weight = kernelX.weights[i]! * kernelY.weights[j]!, partJy = fluxJy * weight; + if (px < 0 || py < 0 || px >= width || py >= height) { budget.outsideGridFluxJy += partJy; continue; } + const p = py * width + px; + if (reserved?.[p]) { budget.reservedCoreFluxJy += partJy; continue; } + if (!band.validity[p]) { budget.unavailableFluxJy += partJy; continue; } + const amplitude = weight * jyToMJySrPixel; + band.data[p] = band.data[p]! - fluxJy * amplitude; + band.variance[p] = band.variance[p]! + (sigmaFluxJy * amplitude) ** 2; + budget.subtractedFluxJy += partJy; if (weight > 0) budget.modifiedPixels++; + } + return budget; +} +async function responseRows(band: 'WISE3' | 'WISE4'): Promise { + let pending = responseCache.get(band); + if (!pending) { + pending = (async () => { + const rows: ResponseRow[] = [], text = await readFile(`.local/infrared/heating/raw/RSR-W${band === 'WISE3' ? 3 : 4}.txt`, 'utf8'); + for (const line of text.split(/\r?\n/u)) { + if (!line.trim() || line.trim().startsWith('#')) continue; + const fields = line.trim().split(/\s+/u), wave = Number(fields[0]), qe = Number(fields[1]); + if (!Number.isFinite(wave) || wave <= 0 || !Number.isFinite(qe) || qe < 0) throw Error('Invalid local WISE photon response.'); rows.push({ wave, qe }); + } + rows.sort((a, b) => a.wave - b.wave); + if (rows.length < 20 || rows.some((row, i) => i > 0 && row.wave <= rows[i - 1]!.wave)) throw Error('WISE response is too short or nonmonotone.'); return rows; + })(); responseCache.set(band, pending); + } + return pending; +} +function photosphereJy(star: Star, wavelengthMicron: number): number { + const distanceM = Math.hypot(star.at[0], star.at[1], 136 + star.at[2]) * PC, radiusM = star.radiusSolar * SOLAR_RADIUS_M; + if (!(star.temperatureK > 0) || !(radiusM > 0) || !(distanceM > 0) || ![star.temperatureK, radiusM, distanceM].every(Number.isFinite)) throw Error('Invalid independent primary photosphere inputs.'); + const h = 6.62607015e-34, c = 299792458, k = 1.380649e-23, nu = c / (wavelengthMicron * 1e-6); + return Math.PI * 2 * h * nu ** 3 / c ** 2 / Math.expm1(h * nu / (k * star.temperatureK)) * (radiusM / distanceM) ** 2 / 1e-26; +} +async function primaryFluxJy(star: Star, band: BandName): Promise { + if (band === 'MIPS24' || band === 'MIPS70') return photosphereJy(star, band === 'MIPS24' ? 23.68 : 71.42); + const response = await responseRows(band); let numerator = 0, denominator = 0; + for (let i = 1; i < response.length; i++) { + const a = response[i - 1]!, b = response[i]!, dx = b.wave - a.wave, wa = a.qe / a.wave, wb = b.qe / b.wave; + numerator += .5 * dx * (wa * photosphereJy(star, a.wave) + wb * photosphereJy(star, b.wave)); denominator += .5 * dx * (wa + wb); + } + if (!(denominator > 0)) throw Error('Zero WISE photon response.'); return numerator / denominator; +} +function genericFlux(point: Point, band: BandName): { fluxJy: number; sigmaJy: number; method: string; spectralIndex?: number } | undefined { + if (band === 'MIPS70') return undefined; + if (band === 'WISE3' || band === 'WISE4') { + const value = band === 'WISE3' ? point.W3 : point.W4; + return value.accepted && value.fluxJy !== null && value.sigmaJy !== null ? { fluxJy: value.fluxJy, sigmaJy: value.sigmaJy, method: 'qualified constant-Fnu catalogue flux' } : undefined; + } + if (!point.W4.accepted || point.W4.fluxJy === null || point.W4.sigmaJy === null) return undefined; + const f4 = point.W4.fluxJy, e4 = point.W4.sigmaJy, frequencyRatio = 22.08 / 23.68; + if (point.W3.accepted && point.W3.fluxJy !== null && point.W3.sigmaJy !== null) { + const f3 = point.W3.fluxJy, e3 = point.W3.sigmaJy, denominator = Math.log(22.08 / 11.56), spectralIndex = Math.log(f3 / f4) / denominator, t = Math.log(frequencyRatio) / denominator; + const fluxJy = f4 * frequencyRatio ** spectralIndex; + return { fluxJy, sigmaJy: fluxJy * Math.sqrt((t * e3 / f3) ** 2 + ((1 - t) * e4 / f4) ** 2 + .15 ** 2), spectralIndex, method: 'accepted W3/W4 Fnu power-law extrapolation22.08to23.68um; adopted15% SED uncertainty' }; + } + const fluxJy = f4 * frequencyRatio ** 2; + return { fluxJy, sigmaJy: Math.hypot(e4 * frequencyRatio ** 2, .3 * fluxJy), spectralIndex: 2, method: 'W4-only Rayleigh-Jeans extrapolation; adopted30% SED uncertainty' }; +} + +export async function cleanBand(band: IrBand, grid: Grid, inputs: Inputs): Promise> { + validateBand(band, grid); cataloguePromise ??= readCatalogue(); const catalogue = await cataloguePromise; + const inputGroups = new Map(); + for (const star of inputs.stars) { const list = inputGroups.get(star.hip) ?? []; list.push(star); inputGroups.set(star.hip, list); } + if (inputGroups.size !== 7 || catalogue.primaries.some(star => !inputGroups.has(star.hip))) throw Error('Physical stars and seven reserved catalogue systems differ.'); + const n = grid.width * grid.height, reserved = new Uint8Array(n), primaryCenters = catalogue.primaries.map(star => ({ star, point: grid.projection.pixelOf(star.ra, star.dec) })); + let newlyUnavailablePixels = 0, reservedPixels = 0, beforeValid = 0; + for (const value of band.validity) if (value) beforeValid++; + const radiusPixel = RESERVATION_ARCSEC / grid.pixelArcsec; + for (const { point } of primaryCenters) { + if (!point) continue; + const [x, y] = point; + for (let py = Math.max(0, Math.ceil(y - radiusPixel)); py <= Math.min(grid.height - 1, Math.floor(y + radiusPixel)); py++) for (let px = Math.max(0, Math.ceil(x - radiusPixel)); px <= Math.min(grid.width - 1, Math.floor(x + radiusPixel)); px++) { + if (Math.hypot(px - x, py - y) > radiusPixel) continue; + const p = py * grid.width + px; + if (!reserved[p]) { reserved[p] = 1; reservedPixels++; if (band.validity[p]) newlyUnavailablePixels++; } + band.validity[p] = 0; band.variance[p] = Infinity; // Keep observed data values; missing measurements are not zero dust. + } + } + const removals: Record[] = [], primaryRemovals: Record[] = []; + let skippedNoAcceptedBand = 0, skippedOutsideProjection = 0, spectralIndexExtrapolations = 0, rayleighJeansExtrapolations = 0; + for (const source of catalogue.points) { + const flux = genericFlux(source, band.name); + if (!flux) { skippedNoAcceptedBand++; continue; } + const p = grid.projection.pixelOf(source.ra, source.dec); + if (!p) { skippedOutsideProjection++; continue; } + const budget = subtractPsf(band, grid.width, grid.height, grid.pixelArcsec, p[0], p[1], PSF[band.name], flux.fluxJy, flux.sigmaJy, reserved); + if (band.name === 'MIPS24') { if (source.W3.accepted) spectralIndexExtrapolations++; else rayleighJeansExtrapolations++; } + removals.push({ designation: source.name, ra: source.ra, dec: source.dec, ...flux, ...budget }); + } + for (const { star, point } of primaryCenters) { + const components = inputGroups.get(star.hip)!; + const componentFluxes = await Promise.all(components.map(component => primaryFluxJy(component, band.name))), fluxJy = componentFluxes.reduce((a, b) => a + b, 0), sigmaJy = .5 * fluxJy; + const budget = point ? subtractPsf(band, grid.width, grid.height, grid.pixelArcsec, point[0], point[1], PSF[band.name], fluxJy, sigmaJy, reserved) : undefined; + primaryRemovals.push({ hip: star.hip, names: components.map(component => component.name), components: components.map((component, i) => ({ name: component.name, temperatureK: component.temperatureK, radiusSolar: component.radiusSolar, fluxJy: componentFluxes[i] })), + fluxJy, sigmaJy, method: band.name.startsWith('WISE') ? 'independent T/R blackbodies integrated through local QE RSR; flat-Fnu equivalent' : 'independent T/R monochromatic photospheres; no MIPS color correction', + adoptedFractionalPhotosphereUncertainty: .5, reservationRadiusArcsec: RESERVATION_ARCSEC, ...budget }); + } + const totalFlux = removals.reduce((sum, entry) => sum + number(entry.subtractedFluxJy, 'subtracted flux'), 0), primaryWingFlux = primaryRemovals.reduce((sum, entry) => sum + (finite(entry.subtractedFluxJy) ? entry.subtractedFluxJy : 0), 0); + return { success: true, band: band.name, operation: 'IR-only fixed unit-integral Gaussian point subtraction; no local flux/shape fitting', sourceCatalogue: CATALOGUE, + grid: { width: grid.width, height: grid.height, pixelArcsec: grid.pixelArcsec }, sourcePsfFwhmArcsec: PSF[band.name], beforeCommon18ArcsecBlur: true, + genericSources: { modeled: removals.length, withObservedSubtraction: removals.filter(entry => number(entry.subtractedFluxJy, 'subtracted flux') > 0).length, skippedNoAcceptedBand, skippedOutsideProjection, subtractedFluxJy: totalFlux, spectralIndexExtrapolations, rayleighJeansExtrapolations }, + primarySystems: { count: primaryRemovals.length, sourceComponents: inputs.stars.length, wingFluxJySubtracted: primaryWingFlux, independentPhysicalFluxes: true, AtlasUnresolvedComponentsSummedOnce: true }, + missingObservations: { reservationRadiusArcsec: RESERVATION_ARCSEC, reservedPixels, newlyUnavailablePixels, areaArcsec2: reservedPixels * grid.pixelArcsec ** 2, beforeValid, afterValid: beforeValid - newlyUnavailablePixels, + dataValuesRetainedInsideReservation: true, densityEdited: false, policy: 'All seven primary cores unavailable for fine NH; other IR bands/coarse prior may constrain positive columns. Alcyone reject-table contamination is not replaced by the wrong neighbour.' }, + uncertainty: 'Source amplitude uncertainty added as (sigmaFlux*unitFluxPSF)^2 to band variance. It is spatially correlated across each PSF; this diagonal variance does not encode full covariance.', + removals, primaryRemovals, + limitations: ['Fixed Gaussian atlas PSFs approximate local asymmetric PRFs; no diffraction-spike/halo model', 'No artifact-position table is used as a complete pixel mask', 'No optical image read; no diffuse filaments or local source gains fitted', 'Negative point-subtracted data retained; no zero clipping', 'Primary blackbodies omit gravity darkening/free-free;36arcsec cores reserved,50% photosphere uncertainty adopted', 'MIPS24 generic22to23.68um extrapolation is a short-band approximation; W4-only RJ and15/30% SED errors are adopted', 'MIPS70 generic sources are intentionally not subtracted; coarse check only', 'Finite field clips PSF flux without renormalizing the in-field wings'] }; +} + +/** Small exact-operator pilot; memory only, no data acquisition or full pipeline. */ +export function compactCleanSelfCheck(): Record { + const cases: Record[] = [], width = 129, height = 129, pixelArcsec = 3, omegaMJy = (pixelArcsec * ARCSEC_RAD) ** 2 * 1e6; + for (const fwhm of [6, 9.5, 16.8, 18]) { + const n = width * height, band: IrBand = { name: 'WISE3', data: new Float32Array(n), variance: new Float32Array(n), validity: new Uint8Array(n).fill(1) }; + const fluxJy = 1.234, sigmaJy = .123, budget = subtractPsf(band, width, height, pixelArcsec, 64.37, 63.81, fwhm, fluxJy, sigmaJy); + let recoveredJy = 0, recoveredSigmaJy = 0; + for (let p = 0; p < n; p++) { recoveredJy -= band.data[p]! * omegaMJy; recoveredSigmaJy += Math.sqrt(band.variance[p]!) * omegaMJy; } + const relativeFluxError = Math.abs(recoveredJy / fluxJy - 1), relativeSigmaError = Math.abs(recoveredSigmaJy / sigmaJy - 1); + if (relativeFluxError > 2e-7 || relativeSigmaError > 2e-7 || Math.abs(budget.requestedFluxJy - budget.subtractedFluxJy) > 1e-10) throw Error('Unit-flux Gaussian conservation pilot failed.'); + cases.push({ fwhmArcsec: fwhm, relativeFluxError, relativeSigmaError }); + } + const edge: IrBand = { name: 'WISE4', data: new Float32Array(width * height), variance: new Float32Array(width * height), validity: new Uint8Array(width * height).fill(1) }; + const edgeBudget = subtractPsf(edge, width, height, pixelArcsec, -.25, 64.3, 16.8, 1, .1); + if (!(edgeBudget.subtractedFluxJy > 0 && edgeBudget.subtractedFluxJy < 1 && edgeBudget.outsideGridFluxJy > 0) || Math.abs(edgeBudget.subtractedFluxJy + edgeBudget.outsideGridFluxJy - 1) > 1e-10) throw Error('PSF edge clipping pilot failed.'); + return { success: true, signal: 'IR_COMPACT_UNIT_FLUX_PASS', cases, edgeClipping: edgeBudget, writes: 0 }; +} diff --git a/packages/bake/authoring/m45/dust/column/fit.mts b/packages/bake/authoring/m45/dust/column/fit.mts new file mode 100644 index 00000000000..c428eab628e --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/fit.mts @@ -0,0 +1,416 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import type { Inputs } from '../physics/types.mts'; +import type { BandName, ColumnResult, IrBand, IrCube } from './types.mts'; + +// Offline inference only. All image values are calibrated MJy/sr; NH is cm^-2. +const NUNIT = 1e20; +const NFLOOR = .02 * 3.1 / (1.086 * 4.983382167689161e-22) / NUNIT; +const P0_MW60 = 4.558e-24; // DL07 total erg/s/H at U=1, not a band emissivity. +const HGRID = [.25, .5, 1, 2, 4]; +const FINE: readonly BandName[] = ['WISE3', 'WISE4', 'MIPS24']; +const NAMES: readonly BandName[] = [...FINE, 'MIPS70']; +const REL = [.20, .15, .15, .30]; +const FLOOR = [.02, .02, .02, .30]; +const CELL = 32, HOLDOUT = 128, SAMPLE = 4; +const KEY = ['WISE3flatFnu', 'WISE4flatFnu', 'MIPS24', 'MIPS70']; + +type Template = { model: string; q: number; logU: Float64Array; e: Float64Array[]; power0: number }; +type Point = { x: number; y: number; tanX: number; tanY: number; train: boolean; n0: number; values: number[]; variances: number[]; counts: number[]; samples: number[] }; +type Observation = { y: number; variance: number; e: number; band: number }; +type Fit = { n: number; variance: number; count: number }; +type Candidate = { h: number; template: Template; e: Float64Array; offsets: number[]; offsetScatter: number[]; + slopesX: number[]; slopesY: number[]; backgroundFitsValid: boolean; + trainScore: number; trainCount: number; validationScore: number; validationCount: number; bandScores: number[] }; +type BackgroundModel = 'constant' | 'plane'; +type PlaneFit = { coefficients: number[]; scatter: number; valid: boolean; points: number }; + +function object(value: unknown): Record { + assert.ok(value !== null && typeof value === 'object' && !Array.isArray(value)); return Object.fromEntries(Object.entries(value)); +} +function number(value: unknown): number { assert.ok(typeof value === 'number' && Number.isFinite(value)); return value; } +function array(value: unknown): unknown[] { assert.ok(Array.isArray(value)); return value; } +function text(value: unknown): string { assert.ok(typeof value === 'string'); return value; } +function median(values: number[]): number { + if (!values.length) return NaN; + values.sort((a, b) => a - b); const mid = values.length >> 1; + return values.length % 2 ? values[mid]! : (values[mid - 1]! + values[mid]!) * .5; +} +function robustLocation(values: number[]): { center: number; scatter: number } { + const center = median([...values]); + return { center, scatter: 1.4826 * median(values.map(v => Math.abs(v - center))) }; +} +const finiteOrNull = (v: number): number | null => Number.isFinite(v) ? v : null; +const failsColor = (meanScore: number, bandMedianScores: number[]): boolean => + meanScore > 4 || bandMedianScores.some(score => Number.isFinite(score) && score > 4); + +function tanPixel(cube: IrCube, x: number, y: number): [number, number] { + const h = cube.header, get = (key: string, fallback: number): number => typeof h[key] === 'number' ? number(h[key]) : fallback; + const dx = x + 1 - get('CRPIX1', (cube.width + 1) * .5), dy = y + 1 - get('CRPIX2', (cube.height + 1) * .5); + return [get('CD1_1', get('CDELT1', -3 / 3600)) * dx + get('CD1_2', 0) * dy, + get('CD2_1', 0) * dx + get('CD2_2', get('CDELT2', 3 / 3600)) * dy]; +} +function solve3(matrix: number[][], rhs: number[]): number[] | undefined { + const a = matrix.map((row, i) => [...row, rhs[i]!]); + for (let col = 0; col < 3; col++) { + let pivot = col; + for (let row = col + 1; row < 3; row++) if (Math.abs(a[row]![col]!) > Math.abs(a[pivot]![col]!)) pivot = row; + if (Math.abs(a[pivot]![col]!) < 1e-12) return undefined; + [a[col], a[pivot]] = [a[pivot]!, a[col]!]; const scale = a[col]![col]!; + for (let j = col; j < 4; j++) a[col]![j]! /= scale; + for (let row = 0; row < 3; row++) if (row !== col) { + const multiplier = a[row]![col]!; + for (let j = col; j < 4; j++) a[row]![j]! -= multiplier * a[col]![j]!; + } + } + return a.map(row => row[3]!); +} +function robustPlane(rows: Array<{ x: number; y: number; value: number }>, mode: BackgroundModel, floor: number): PlaneFit { + const location = robustLocation(rows.map(row => row.value)); + if (mode === 'constant') return { coefficients: [location.center, 0, 0], scatter: location.scatter, valid: rows.length > 0, points: rows.length }; + let beta = [location.center, 0, 0]; + if (rows.length < 6) return { coefficients: beta, scatter: location.scatter, valid: false, points: rows.length }; + // A fixed six-step Huber IRLS solve is the single plane trial, not a new local fit. + for (let iteration = 0; iteration < 6; iteration++) { + const residuals = rows.map(row => row.value - beta[0]! - beta[1]! * row.x - beta[2]! * row.y); + const scale = Math.max(floor, robustLocation(residuals).scatter), matrix = [[0, 0, 0], [0, 0, 0], [0, 0, 0]], rhs = [0, 0, 0]; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]!, basis = [1, row.x, row.y], weight = Math.min(1, 1.345 * scale / Math.max(Math.abs(residuals[i]!), 1e-30)); + for (let a = 0; a < 3; a++) { + rhs[a]! += weight * basis[a]! * row.value; + for (let b = 0; b < 3; b++) matrix[a]![b]! += weight * basis[a]! * basis[b]!; + } + } + const next = solve3(matrix, rhs); + if (!next || !next.every(Number.isFinite)) return { coefficients: beta, scatter: scale, valid: false, points: rows.length }; + beta = next; + } + const scatter = robustLocation(rows.map(row => row.value - beta[0]! - beta[1]! * row.x - beta[2]! * row.y)).scatter; + return { coefficients: beta, scatter, valid: true, points: rows.length }; +} + +let templatePromise: Promise | undefined; +async function templates(): Promise { + templatePromise ??= (async () => { + const raw: unknown = JSON.parse(await readFile('.local/infrared/heating/emissivity-grid.json', 'utf8')); + const root = object(raw); assert.equal(root.schema, 'pleiades-dl07-ir-emissivity@1'); + assert.equal(root.jNuUnit, 'Jy cm2 sr-1 H-1'); + const models = new Map>(); + for (const value of array(root.rows)) { + const row = object(value), name = text(row.model), U = number(row.U), q = number(row.qPahPercent); + const bands = object(row.jNuJyCm2SrPerH); + const e = KEY.map(key => number(bands[key]) * 1e14); // MJy/sr per 1e20 H/cm². + assert.ok(U > 0 && e.every(v => v > 0)); + const rows = models.get(name) ?? []; rows.push({ U, q, e, power: number(row.powerErgPerSecPerH) }); models.set(name, rows); + } + const result: Template[] = []; + for (const [model, rows] of models) { + rows.sort((a, b) => a.U - b.U); + assert.ok(rows.length >= 10 && rows.every((r, i) => i === 0 || r.U > rows[i - 1]!.U)); + const u1 = rows.find(row => row.U === 1); assert.ok(u1, 'Missing U=1 absorbed-power normalization'); + result.push({ model, q: u1.q, power0: u1.power, logU: Float64Array.from(rows, r => Math.log(r.U)), + e: KEY.map((_, band) => Float64Array.from(rows, r => Math.log(r.e[band]!))) }); + } + assert.equal(result.length, 3); return result.sort((a, b) => a.q - b.q); + })(); + return templatePromise; +} +function bracket(t: Template, U: number): { lo: number; f: number; clamped: boolean } { + const l = Math.log(Math.max(U, Number.MIN_VALUE)), last = t.logU.length - 1; + if (l <= t.logU[0]!) return { lo: 0, f: 0, clamped: l < t.logU[0]! }; + if (l >= t.logU[last]!) return { lo: last - 1, f: 1, clamped: l > t.logU[last]! }; + let lo = 0, hi = last; + while (hi - lo > 1) { const mid = (lo + hi) >> 1; if (t.logU[mid]! <= l) lo = mid; else hi = mid; } + return { lo, f: (l - t.logU[lo]!) / (t.logU[hi]! - t.logU[lo]!), clamped: false }; +} +function coefficients(out: Float64Array, cube: IrCube, p: number, h: number, t: Template): boolean { + if (cube.heatingNodes) { + out.fill(0); let clamped=false; + const ratio=P0_MW60/t.power0,fraction=Math.max(0,Math.min(1,cube.fcoarse[p]!)); + for(let layer=0;layer<2;layer++)for(let node=0;node= 0 && Number.isFinite(cube.fcoarse[p]) + && Number.isFinite(cube.Ustar0[p]) && cube.Ustar0[p]! >= 0 && Number.isFinite(cube.Ustar1[p]) && cube.Ustar1[p]! >= 0; +} +function usable(data: Float32Array, variance: Float32Array, validity: Uint8Array, p: number): boolean { + return validity[p]! > 0 && Number.isFinite(data[p]) && Number.isFinite(variance[p]) && variance[p]! >= 0; +} +function effectiveVariance(variance: number, correctedBrightness: number, band: number): number { + return Math.max(0, variance) + FLOOR[band]! ** 2 + (REL[band]! * Math.abs(correctedBrightness)) ** 2; +} +function infer(observations: Observation[], n0: number, excludedBand = -1): Fit { + const priorWeight = Number.isFinite(n0) ? 1 / (n0 * n0 + NFLOOR * NFLOOR) : 0; + let numerator = priorWeight * (Number.isFinite(n0) ? n0 : 0), denominator = priorWeight, count = 0; + for (const obs of observations) { + if (obs.band === excludedBand) continue; + const weight = 1 / effectiveVariance(obs.variance, obs.y, obs.band); + numerator += weight * obs.e * obs.y; denominator += weight * obs.e * obs.e; count++; + } + return { n: denominator > 0 ? Math.max(0, numerator / denominator) : NaN, variance: denominator > 0 ? 1 / denominator : Infinity, count }; +} +function observations(point: Point, e: Float64Array, offset: number, backgrounds: number[], slopesX: number[], slopesY: number[]): Observation[] { + const out: Observation[] = []; + for (let b = 0; b < 3; b++) if (point.counts[b]! > 0 && Number.isFinite(backgrounds[b])) { + out.push({ band: b, y: point.values[b]! - backgrounds[b]! - slopesX[b]! * point.tanX - slopesY[b]! * point.tanY, variance: point.variances[b]!, e: e[offset + b]! }); + } + return out; +} +function scores(points: Point[], e: Float64Array, backgrounds: number[], slopesX: number[], slopesY: number[], train: boolean): { score: number; count: number; perBand: number[] } { + const values: number[] = [], bandValues: number[][] = [[], [], []]; + for (let i = 0; i < points.length; i++) { + const p = points[i]!; if (p.train !== train) continue; + const obs = observations(p, e, i * 4, backgrounds, slopesX, slopesY); if (obs.length < 3) continue; + for (const held of obs) { + const fitted = infer(obs, p.n0, held.band); + const variance = effectiveVariance(held.variance, held.y, held.band) + held.e ** 2 * fitted.variance; + const z2 = (held.y - fitted.n * held.e) ** 2 / variance; + values.push(z2); bandValues[held.band]!.push(z2); + } + } + // A 10% upper trim limits unmasked artifacts; diagnostics retain band medians. + values.sort((a, b) => a - b); const keep = Math.ceil(values.length * .9); + const score = keep ? values.slice(0, keep).reduce((s, v) => s + v, 0) / keep : Infinity; + return { score, count: values.length, perBand: bandValues.map(v => median(v)) }; +} +function coarsePoints(cube: IrCube, bands: IrBand[]): Point[] { + const out: Point[] = [], { width, height } = cube; + for (let y = 0; y < height; y += CELL) for (let x = 0; x < width; x += CELL) { + const sum = [0, 0, 0, 0], variance = [0, 0, 0, 0], counts = [0, 0, 0, 0], samples: number[] = []; + let prior = 0, priorCount = 0; + for (let j = y; j < Math.min(height, y + CELL); j++) for (let i = x; i < Math.min(width, x + CELL); i++) { + const p = j * width + i; if (!geometryValid(cube, p)) continue; + prior += cube.NHprior[p]! / NUNIT; priorCount++; + if ((j - y) % SAMPLE === Math.min(2, height - y - 1) && (i - x) % SAMPLE === Math.min(2, width - x - 1)) samples.push(p); + for (let b = 0; b < 4; b++) { + const band = bands[b]!, data = b === 3 ? band.coarseData : band.data; + const vari = b === 3 ? band.coarseVariance : band.variance, mask = b === 3 ? band.coarseValidity : band.validity; + if (!data || !vari || !mask || !usable(data, vari, mask, p)) continue; + sum[b]! += data[p]!; variance[b]! += vari[p]!; counts[b]!++; + } + } + if (!priorCount || !samples.length) continue; + const minimum = Math.min(32, Math.ceil(priorCount * .125)); + for (let b = 0; b < 4; b++) if (counts[b]! < minimum) counts[b] = 0; + const hash = (Math.floor(x / HOLDOUT) * 17 + Math.floor(y / HOLDOUT) * 31) % 4; + const [tanX, tanY] = tanPixel(cube, x + (Math.min(width, x + CELL) - x - 1) * .5, y + (Math.min(height, y + CELL) - y - 1) * .5); + out.push({ x: x / CELL, y: y / CELL, tanX, tanY, train: hash !== 0, n0: prior / priorCount, + values: sum.map((s, b) => counts[b]! ? s / counts[b]! : NaN), + variances: variance.map((s, b) => counts[b]! ? s / counts[b]! ** 2 : Infinity), counts, samples }); + } + return out; +} +function candidate(points: Point[], cube: IrCube, h: number, template: Template, mode: BackgroundModel): Candidate { + const e = new Float64Array(points.length * 4), temp = new Float64Array(4), residuals: Array> = [[], [], []]; + for (let i = 0; i < points.length; i++) { + const p = points[i]!, plain = [0, 0, 0, 0]; let priorWeight = 0; + for (const pixel of p.samples) { + coefficients(temp, cube, pixel, h, template); const n = cube.NHprior[pixel]! / NUNIT; + priorWeight += n; + for (let b = 0; b < 4; b++) { e[i * 4 + b]! += temp[b]! * n; plain[b]! += temp[b]!; } + } + for (let b = 0; b < 4; b++) { + e[i * 4 + b] = priorWeight > 0 ? e[i * 4 + b]! / priorWeight : plain[b]! / p.samples.length; + // MIPS70 is never an offset/selection input at the fine-model stage. + if (b < 3 && p.train && p.counts[b]! > 0) residuals[b]!.push({ x: p.tanX, y: p.tanY, value: p.values[b]! - p.n0 * e[i * 4 + b]! }); + } + } + const locations = residuals.map((v, b) => robustPlane(v, mode, FLOOR[b]!)); + const offsets = locations.map(v => v.coefficients[0]!), offsetScatter = locations.map(v => v.scatter); + const slopesX = locations.map(v => v.coefficients[1]!), slopesY = locations.map(v => v.coefficients[2]!); + const train = scores(points, e, offsets, slopesX, slopesY, true), validation = scores(points, e, offsets, slopesX, slopesY, false); + return { h, template, e, offsets, offsetScatter, slopesX, slopesY, backgroundFitsValid: locations.every(v => v.valid), trainScore: train.score, trainCount: train.count, + validationScore: validation.score, validationCount: validation.count, bandScores: validation.perBand }; +} +function smoothCoarse(points: Point[], values: number[], pixelArcsec: number): number[] { + const sigma = 180 / 2.354820045 / (CELL * pixelArcsec), radius = Math.ceil(3 * sigma); + const lookup = new Map(points.map((p, i) => [`${p.x},${p.y}`, i])); + return points.map(p => { + let sum = 0, weight = 0; + for (let dy = -radius; dy <= radius; dy++) for (let dx = -radius; dx <= radius; dx++) { + const i = lookup.get(`${p.x + dx},${p.y + dy}`); if (i === undefined || !Number.isFinite(values[i])) continue; + const w = Math.exp(-(dx * dx + dy * dy) / (2 * sigma * sigma)); sum += w * values[i]!; weight += w; + } + return weight > 0 ? sum / weight : NaN; + }); +} +function check70(points: Point[], chosen: Candidate, pixelArcsec: number): Record { + const priorPrediction = smoothCoarse(points, points.map((p, i) => p.n0 * chosen.e[i * 4 + 3]!), pixelArcsec); + const offset = robustLocation(points.flatMap((p, i) => p.train && p.counts[3]! > 0 && Number.isFinite(priorPrediction[i]) + ? [p.values[3]! - priorPrediction[i]!] : [])); + if (!Number.isFinite(offset.center)) return { status: 'unavailable', reason: 'No supplied 180-arcsec MIPS70 crosscheck arrays; striped native data excluded.' }; + const inferred = points.map((p, i) => infer(observations(p, chosen.e, i * 4, chosen.offsets, chosen.slopesX, chosen.slopesY), p.n0).n * chosen.e[i * 4 + 3]!); + const predicted = smoothCoarse(points, inferred, pixelArcsec), z2: number[] = [], fractional: number[] = []; + for (let i = 0; i < points.length; i++) { + const p = points[i]!; if (p.train || !p.counts[3] || !Number.isFinite(predicted[i])) continue; + const y = p.values[3]! - offset.center, residual = y - predicted[i]!; + z2.push(residual * residual / effectiveVariance(p.variances[3]!, y, 3)); + if (Math.abs(y) > 3 * FLOOR[3]!) fractional.push(residual / Math.abs(y)); + } + return { status: z2.length >= 8 ? 'crosscheck-only' : 'insufficient-coverage', nativeFineDataUsed: false, + backgroundMJySr: offset.center, backgroundResidualScatterMJySr: offset.scatter, heldOutSamples: z2.length, + medianNormalizedResidualSquared: finiteOrNull(median(z2)), medianFractionalResidual: finiteOrNull(median(fractional)), + modelSmoothingFwhmArcsec: 180, systematicFraction: REL[3], usedForParameterSelection: false }; +} + +export async function fitColumn(data: IrCube, inputs: Inputs, options: { backgroundModel?: BackgroundModel } = {}): Promise { + const backgroundModel = options.backgroundModel ?? 'plane'; + const began = performance.now(), { width, height } = data, size = width * height; + assert.ok(Number.isSafeInteger(width) && width > 0 && Number.isSafeInteger(height) && height > 0); + assert.ok(inputs.stars.length > 0, 'Missing parent stellar heating inputs'); + for (const field of [data.NHprior, data.Ustar0, data.Ustar1, data.fcoarse]) assert.equal(field.length, size); + if(data.heatingNodes){assert.ok(Math.abs(data.heatingNodes.weights.reduce((a,b)=>a+b,0)-1)<1e-8);for(const layer of data.heatingNodes.layers){assert.equal(layer.length,data.heatingNodes.weights.length);for(const node of layer){assert.equal(node.length,size);assert.ok(node.every(v=>Number.isFinite(v)&&v>=0));}}} + const bands = NAMES.map(name => { const found = data.bands.filter(b => b.name === name); assert.equal(found.length, 1, `Missing/duplicate ${name}`); return found[0]!; }); + for (const band of bands) for (const field of [band.data, band.variance, band.validity, band.coarseData, band.coarseVariance, band.coarseValidity]) if (field) assert.equal(field.length, size); + const grid = await templates(), points = coarsePoints(data, bands), candidates: Candidate[] = []; + for (const template of grid) for (const h of HGRID) candidates.push(candidate(points, data, h, template, backgroundModel)); + // Select on training IR colors only; held-out scores never choose a candidate. + candidates.sort((a, b) => a.trainScore - b.trainScore || Math.abs(Math.log(a.h)) - Math.abs(Math.log(b.h)) || b.template.q - a.template.q); + const chosen = candidates[0]!; + const NH = new Float32Array(size), validity = new Uint8Array(size), e = new Float64Array(4); + let priorOnly = 0, unknown = 0, irPixels = 0, singleBandPixels = 0, clamped = 0; + const bandCounts = [0, 0, 0]; + for (let p = 0; p < size; p++) { + if (!geometryValid(data, p)) { NH[p] = Number.isFinite(data.NHprior[p]) && data.NHprior[p]! >= 0 ? data.NHprior[p]! : NaN; priorOnly++; unknown++; continue; } + const n0 = data.NHprior[p]! / NUNIT; + if (coefficients(e, data, p, chosen.h, chosen.template)) clamped++; + const obs: Observation[] = [], [tanX, tanY] = backgroundModel === 'plane' ? tanPixel(data, p % width, Math.floor(p / width)) : [0, 0]; + for (let b = 0; b < 3; b++) { + const band = bands[b]!; if (!usable(band.data, band.variance, band.validity, p) || !Number.isFinite(chosen.offsets[b])) continue; + const background = chosen.offsets[b]! + chosen.slopesX[b]! * tanX + chosen.slopesY[b]! * tanY; + obs.push({ band: b, y: band.data[p]! - background, variance: band.variance[p]!, e: e[b]! }); bandCounts[b]!++; + } + if (!obs.length) { NH[p] = data.NHprior[p]!; priorOnly++; continue; } + NH[p] = infer(obs, n0).n * NUNIT; validity[p] = 1; irPixels++; + if (obs.length === 1) singleBandPixels++; + } + const insufficient = chosen.trainCount < 24 || chosen.validationCount < 24; + const colorFailure = !insufficient && failsColor(chosen.validationScore, chosen.bandScores); + const pixelArcsec = (() => { + const cd11 = data.header.CD1_1, cd21 = data.header.CD2_1, cdelt = data.header.CDELT1; + if (typeof cd11 === 'number' && typeof cd21 === 'number') return Math.hypot(cd11, cd21) * 3600; + if (typeof cdelt === 'number') return Math.abs(cdelt) * 3600; + return 3; + })(); + return { NH, validity, metadata: { + schema: 'pleiades-ir-column-fit@1', status: insufficient ? 'insufficient-ir-color-coverage' : colorFailure ? 'ir-color-model-failure' : 'conditionally-constrained', + recommendedForColumnUse: !insufficient && !colorFailure && clamped === 0 && chosen.backgroundFitsValid, colorModelFailure: colorFailure, + physicalMeaning: 'IR-constrained beam-averaged column on frozen conditional Pleiades depth/layer prior; not uniquely measured 3D dust.', + heatingIntegration:data.heatingNodes?{method:'Dust-mass quadrature of emissivities, with spectrally integrated direct-beam UV/optical shielding',nodesPerLayer:data.heatingNodes.weights.length,weights:data.heatingNodes.weights}:{method:'Unattenuated direct stellar heating at each layer mean; sensitivity control only'}, + NHunit: 'H nucleons cm-2', inputSurfaceBrightnessUnit: 'MJy sr-1', pixelArcsec, + selected: { hU: chosen.h, qPahPercent: chosen.template.q, model: chosen.template.model, Ubackground: 1, + qNormalization: 'parent MW3.1_60 excess U multiplied by P0_MW60/P0_q', power0ErgPerSecPerH: chosen.template.power0, + hUMeaning: 'energy-normalized spectral-shape coordinate, not extra stellar power', + energyNormalization: 'each layer j(Ushape) multiplied by Uphysical/Ushape; Uphysical=1+Ustar*P0_MW60/P0_q', + shapeApproximation: 'scaled MMP83 template shape is not a calculation of B-star stochastic heating' }, + backgroundsMJySr: Object.fromEntries(FINE.map((name, b) => [name, finiteOrNull(chosen.offsets[b]!)])), + backgroundResidualScatterMJySr: Object.fromEntries(FINE.map((name, b) => [name, finiteOrNull(chosen.offsetScatter[b]!)])), + backgroundModel, + backgroundPlanes: Object.fromEntries(FINE.map((name, b) => { + const corners = [[0, 0], [width - 1, 0], [0, height - 1], [width - 1, height - 1]].map(([x, y]) => { + const [tx, ty] = tanPixel(data, x!, y!); return chosen.offsets[b]! + chosen.slopesX[b]! * tx + chosen.slopesY[b]! * ty; + }); + const rawPlane = robustPlane(points.flatMap(p => p.train && p.counts[b]! > 0 ? [{ x: p.tanX, y: p.tanY, value: p.values[b]! }] : []), 'plane', FLOOR[b]!); + return [name, { offsetMJySr: finiteOrNull(chosen.offsets[b]!), gradientTanXMJySrPerDegree: chosen.slopesX[b], gradientTanYMJySrPerDegree: chosen.slopesY[b], + rangeAcrossGridMJySr: [Math.min(...corners), Math.max(...corners)], peakToPeakMJySr: Math.max(...corners) - Math.min(...corners), + rawTrainingImagePlane: { offsetMJySr: finiteOrNull(rawPlane.coefficients[0]!), gradientTanXMJySrPerDegree: rawPlane.coefficients[1], gradientTanYMJySrPerDegree: rawPlane.coefficients[2] } }]; + })), + backgroundCoordinate: 'FITS TAN intermediate x/y degrees relative to CRVAL; nine global additive coefficients for plane mode; no local gains', + backgroundMethod: backgroundModel === 'plane' ? 'train-only six-step Huber robust plane fit to coarse I-NHprior*emissivity; one offset plus TAN x/y slope per fine band; unchanged overlap correction' : 'train-only coarse median(I-NHprior*emissivity); one additive offset per band after upstream overlap correction; no local gain', + systematicFraction: Object.fromEntries(FINE.map((name, b) => [name, REL[b]])), + absoluteFloorMJySr: Object.fromEntries(FINE.map((name, b) => [name, FLOOR[b]])), + weighting: 'variance + absoluteFloor^2 + (relativeSystematic*abs(I-background))^2; raw zodiacal level never sets systematic weight', + prior: { sigmaNH: 'sqrt(NHprior^2 + floorNH^2)', floorNH: NFLOOR * NUNIT, basis: '100% column uncertainty plus adopted 0.02 mag E(B-V) floor in quadrature' }, + validation: { coarseCellPixels: CELL, modelSampleStridePixels: SAMPLE, independentHoldoutBlockPixels: HOLDOUT, + holdout: '(17*floor(x/128)+31*floor(y/128))%4 == 0', trainSamples: chosen.trainCount, + heldOutSamples: chosen.validationCount, statistic: 'mean leave-one-band-out standardized squared error after upper10% trim; posterior column variance propagated', + trainingScore: finiteOrNull(chosen.trainScore), heldOutScore: finiteOrNull(chosen.validationScore), failureThreshold: 4, + failureRule: 'held-out trimmed mean >4 OR any individual band median >4; a coherent failing band cannot hide in the mean', + medianHeldOutSquaredErrorByBand: Object.fromEntries(FINE.map((name, b) => [name, finiteOrNull(chosen.bandScores[b]!)])), + opticalPhotoRead: false, selectionUsesHeldOutBlocks: false }, + scan: candidates.map(v => ({ hU: v.h, qPahPercent: v.template.q, trainingScore: finiteOrNull(v.trainScore), heldOutScore: finiteOrNull(v.validationScore) })), + nearEquivalentChoices: candidates.filter(v => v.trainScore <= chosen.trainScore * 1.05 + .01).map(v => ({ hU: v.h, qPahPercent: v.template.q })), + pixels: { total: size, irConstrained: irPixels, singleFineBand: singleBandPixels, priorOnly, unknownGeometry: unknown, interpolationClamped: clamped, + contributingByFineBand: Object.fromEntries(FINE.map((name, b) => [name, bandCounts[b]])), validityMeaning: '1=at least one usable fine-IR band;0=unchanged prior or unknown; unknown input prior remains NaN' }, + mips70: check70(points, chosen, pixelArcsec), frozenNormalDepthPc: { extensiveDust: 136, starNearDust: 136.4, stars: 136.7 }, + limitations: ['hU and qPAH are global effective IR calibrations; MMP83 templates do not reproduce arbitrary B-star spectral hardness.', + 'No per-pixel heating, PAH fraction, optical texture, or photometric gain is fitted.', + '32-pixel coarse offset inference uses sparse prior-weighted emissivity samples; retain coarse-forward-model approximation uncertainty.', + 'MIPS70 native stripes do not enter the column map or parameter selection.'], + elapsedSeconds: (performance.now() - began) / 1000, + } }; +} + +export function columnFitSelfCheck(): Record { + assert.equal(effectiveVariance(.1, 1000 - 999, 0), effectiveVariance(.1, 10 - 9, 0), 'Raw zodiacal offsets must not change relative weights'); + assert.equal(infer([], 3).n, 3, 'No IR data must preserve the prior'); + assert.ok(Number.isNaN(infer([], NaN).n), 'Unknown with no data must stay unknown'); + const consistent: Observation[] = [1, 2, 4].map((e, band) => ({ band, e, y: 5 * e, variance: .001 })); + assert.ok(Math.abs(infer(consistent, 5).n - 5) < 1e-12, 'Physical column must be recovered'); + const corrupted = consistent.map(o => ({ ...o, y: o.band === 0 ? 1000 : o.y })); + const held = corrupted[0]!, fitted = infer(corrupted, 5, 0); + assert.ok((held.y - fitted.n * held.e) ** 2 / (effectiveVariance(held.variance, held.y, 0) + held.e ** 2 * fitted.variance) > 4, + 'A large color failure must be detected by a held-out band'); + assert.equal(failsColor(2, [.1, .1, 5]), true, 'One coherent failing band must not hide in an acceptable overall mean'); + const planeRows = Array.from({ length: 121 }, (_, i) => { const x = (i % 11 - 5) / 10, y = (Math.floor(i / 11) - 5) / 10; return { x, y, value: 2 + 3 * x - 4 * y + (i === 0 ? 1000 : 0) }; }); + const plane = robustPlane(planeRows, 'plane', .02); assert.ok(plane.valid); + assert.ok(plane.coefficients.every((v, i) => Math.abs(v - [2, 3, -4][i]!) < .05), 'Robust additive plane must recover known gradients despite an outlier'); + return { status: 'verified', checks: ['corrected-brightness weighting', 'missing-data prior preservation', 'unknown preservation', 'column recovery', 'held-out color failure'] }; +} + +export async function columnFitPrototypePilot(inputs: Inputs, backgroundModel: BackgroundModel = 'constant'): Promise> { + columnFitSelfCheck(); + const width = 256, height = 256, size = width * height, truth = new Float32Array(size), NHprior = new Float32Array(size); + const fcoarse = new Float32Array(size), Ustar0 = new Float32Array(size), Ustar1 = new Float32Array(size); + const bands: IrBand[] = NAMES.map(name => ({ name, data: new Float32Array(size), variance: new Float32Array(size), validity: new Uint8Array(size) })); + const cube: IrCube = { width, height, header: { CDELT1: -3 / 3600, CDELT2: 3 / 3600 }, bands, NHprior, fcoarse, Ustar0, Ustar1 }; + const template = (await templates()).find(t => t.model === 'MW3.1_60'); assert.ok(template); + const e = new Float64Array(4), offsets = [6, 25, 30, 10], slopesX = [1, -2, 1.5, 0], slopesY = [-2, 3, .5, 0]; + for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) { + const p = y * width + x, n = 3 + .5 * Math.sin(x / 5) + .5 * Math.cos(y / 7); + truth[p] = n * NUNIT; NHprior[p] = 3 * NUNIT; fcoarse[p] = .35; + Ustar0[p] = 5 + 35 * x / width; Ustar1[p] = 12 + 70 * y / height; + coefficients(e, cube, p, 1, template); + for (let b = 0; b < 4; b++) { + const [tanX, tanY] = tanPixel(cube, x, y), gradient = backgroundModel === 'plane' ? slopesX[b]! * tanX + slopesY[b]! * tanY : 0; + const band = bands[b]!; band.data[p] = n * e[b]! + offsets[b]! + gradient; band.variance[p] = .005 ** 2; + // Deliberate empty/saturated patch: its true column differs from its prior. + band.validity[p] = x >= 100 && x < 120 && y >= 100 && y < 120 ? 0 : 1; + } + } + const result = await fitColumn(cube, inputs, { backgroundModel }); + let n = 0, tx = 0, rx = 0, tt = 0, rr = 0, tr = 0, noData = 0; + for (let p = 0; p < size; p++) { + if (!bands[0]!.validity[p]) { + assert.equal(result.validity[p], 0); assert.equal(result.NH[p], NHprior[p]); noData++; continue; + } + const t = truth[p]! / NUNIT, r = result.NH[p]! / NUNIT; + assert.ok(Number.isFinite(r) && r >= 0); n++; tx += t; rx += r; tt += t * t; rr += r * r; tr += t * r; + } + const correlation = (tr - tx * rx / n) / Math.sqrt((tt - tx * tx / n) * (rr - rx * rx / n)); + const recoveredScatter = Math.sqrt((rr - rx * rx / n) / n), trueScatter = Math.sqrt((tt - tx * tx / n) / n); + assert.ok(correlation > .8 && recoveredScatter > .5 * trueScatter, 'The IR data must recover column structure absent from the prior'); + return { status: 'verified', width, height, backgroundModel, inferredPixels: n, preservedPriorOnlyPixels: noData, + correlation, recoveredScatter, trueScatter, selected: result.metadata.selected, + heldOut: result.metadata.validation, elapsedSeconds: result.metadata.elapsedSeconds }; +} diff --git a/packages/bake/authoring/m45/dust/column/intake.mts b/packages/bake/authoring/m45/dust/column/intake.mts new file mode 100644 index 00000000000..a3a5fb8caa2 --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/intake.mts @@ -0,0 +1,44 @@ +import {readFile,writeFile,mkdir,readdir} from 'node:fs/promises'; +import {join} from 'node:path'; +import {gunzipSync} from 'node:zlib'; +import {readFitsImage,skyProjection,type FitsHeader,type SkyProjection} from '@cssearth/fits'; +import {requireRecord,requireArray,requireFiniteNumber} from '@cssearth/core'; +import {loadInputs,skyDirection} from '../physics/config.mts'; +import {dot,type Vec} from '../physics/types.mts'; +import type {IrBand,IrCube,BandName} from './types.mts'; +import {cleanBand} from './compact-clean.mts'; +export const SAVE=process.env.PLEIADES_COLUMN_OUTPUT??'src/objects/milky-way-pleiades-dust/source/inputs/column'; +if(!SAVE.startsWith('src/objects/milky-way-pleiades-dust/source/inputs/column'))throw Error('Pleiades output stays local'); +export const W=Number(process.env.PLEIADES_COLUMN_WIDTH??2048),H=Number(process.env.PLEIADES_COLUMN_HEIGHT??W),PIXEL_ARCSEC=3; +if(!Number.isSafeInteger(W)||!Number.isSafeInteger(H)||W<64||H<64||W>4096||H>4096)throw Error('Invalid Pleiades grid'); +export const HEADER:FitsHeader={CTYPE1:'RA---TAN',CTYPE2:'DEC--TAN',CRVAL1:Number(process.env.PLEIADES_COLUMN_RA??56.58),CRVAL2:Number(process.env.PLEIADES_COLUMN_DEC??24.1),CRPIX1:(W+1)/2,CRPIX2:(H+1)/2,CDELT1:-PIXEL_ARCSEC/3600,CDELT2:PIXEL_ARCSEC/3600,RADESYS:'ICRS'}; +export const targetProjection=skyProjection(HEADER); +const CXV=4.983382e-22,EBV_NH=3.1/1.085736/CXV; +const save=async(p:string,v:unknown)=>writeFile(p,JSON.stringify(v,null,2)+'\n'); +export async function f32(path:string):Promise{const b=await readFile(path);if(b.length%4)throw Error('Float array length');const a=new Float32Array(b.length/4);for(let i=0;i{const dir='.local/infrared/wise/full',files=(await readdir(dir)).filter(f=>f.endsWith('.export.json')),tiles:Tile[]=[]; + for(const file of files){const r=requireRecord(JSON.parse(await readFile(join(dir,file),'utf8'))),width=requireFiniteNumber(r.width),height=requireFiniteNumber(r.height),band=requireFiniteNumber(r.band),id=String(r.coadd),arrays=requireRecord(r.arrays),data=await f32(join(dir,String(arrays.intensity))),unc=await f32(join(dir,String(arrays.uncertainty))),observed=await readFile(join(dir,String(arrays.observed))),quality=await readFile(join(dir,String(arrays.quality))),mask=Uint8Array.from(observed,(v,i)=>v&&quality[i]===0?1:0),variance=Float32Array.from(unc,v=>v*v);if(data.length!==width*height)throw Error('WISE shape'); + const offset=id.startsWith('0577')?(band===3?-.01198:.51835):0;tiles.push({id,name:band===3?'WISE3':'WISE4',width,height,project:skyProjection(fitsHeader(r.header)),data,variance,mask,offset}); + }return tiles;} +async function spitzerTiles():Promise{const dir='.local/infrared/spitzer',r=requireRecord(JSON.parse(await readFile(join(dir,'products.json'),'utf8'))),products=requireArray(r.products).map(v=>requireRecord(v)),tiles:Tile[]=[]; + for(const aor of [8798976,8798720])for(const channel of [1,2]){const paths=['maic','munc','mcov'].map(role=>{const p=products.find(p=>p.aor===aor&&p.channel===channel&&p.role===role);if(!p)throw Error('MIPS product missing');return join(dir,String(p.file));}),[im,unc,cov]=await Promise.all(paths.map(fits));if(!im||!unc||!cov||im.width!==unc.width||im.height!==cov.height)throw Error('MIPS ancillary shape');const mask=Uint8Array.from(im.values,(v,i)=>Number.isFinite(v)&&Number.isFinite(unc.values[i])&&unc.values[i]!>0&&cov.values[i]!>0?1:0),variance=Float32Array.from(unc.values,v=>v*v),name=channel===1?'MIPS24':'MIPS70',offset=aor===8798720?(channel===1?-3.191:-18.39):0;tiles.push({id:String(aor),name,width:im.width,height:im.height,project:skyProjection(im.header),data:Float32Array.from(im.values),variance,mask,offset}); + }return tiles;} +function at(tile:Tile,ra:number,dec:number):[number,number]|undefined{const p=tile.project.pixelOf(ra,dec);if(!p)return;const x=Math.floor(p[0]),y=Math.floor(p[1]),u=p[0]-x,v=p[1]-y;if(x<0||y<0||x>=tile.width-1||y>=tile.height-1)return;let value=0,variance=0,weight=0;for(let j=0;j<2;j++)for(let i=0;i<2;i++){const k=(y+j)*tile.width+x+i;if(!tile.mask[k])continue;const w=(i?u:1-u)*(j?v:1-v);value+=(tile.data[k]!+tile.offset)*w;variance+=tile.variance[k]!*w*w;weight+=w;}return weight>.999?[value/weight,variance/(weight*weight)]:undefined;} +function convolve(a:Float32Array,width:number,height:number,sigma:number):Float32Array{if(sigma<.1)return a.slice();const r=Math.ceil(sigma*4),k=Array.from({length:2*r+1},(_,i)=>Math.exp(-.5*((i-r)/sigma)**2)),total=k.reduce((a,b)=>a+b,0);for(let i=0;iv?1:0),weighted=Float32Array.from(band.data,(v,i)=>band.validity[i]?v:0),weight=convolve(mask,W,H,sigma),numerator=convolve(weighted,W,H,sigma),variance=convolve(Float32Array.from(band.variance,(v,i)=>band.validity[i]?v:0),W,H,sigma);for(let i=0;i1e-5?numerator[i]!/weight[i]!:NaN;band.variance[i]=weight[i]!>1e-5?variance[i]!/(weight[i]!*weight[i]!):Infinity;band.validity[i]=weight[i]!>.95?1:0;}return band;} +export async function prepareCube():Promise{await mkdir(SAVE,{recursive:true});const start=Date.now(),tiles=[...await wiseTiles(),...await spitzerTiles()],inputs=await loadInputs(),projection=targetProjection,bands:IrBand[]=[],diagnostics:Record[]=[]; + for(const name of ['WISE3','WISE4','MIPS24','MIPS70'] as BandName[]){const sources=tiles.filter(t=>t.name===name),data=new Float32Array(W*H),variance=new Float32Array(W*H),validity=new Uint8Array(W*H);let valid=0; + for(let y=0;y0){data[k]=sum/weight;variance[k]=1/weight;validity[k]=1;valid++;}else{data[k]=NaN;variance[k]=Infinity;}} + let band:IrBand={name,data,variance,validity};const points=await cleanBand(band,{width:W,height:H,projection,pixelArcsec:PIXEL_ARCSEC},inputs),psf=name==='WISE3'?9.5:name==='WISE4'?16.8:name==='MIPS24'?6:18,sigma=Math.sqrt(18**2-psf**2)/2.355/PIXEL_ARCSEC;band=blurBand(band,sigma); + if(name==='MIPS70'){const coarse:IrBand={name,data:data.slice(),variance:variance.slice(),validity:validity.slice()};blurBand(coarse,Math.sqrt(180**2-18**2)/2.355/PIXEL_ARCSEC);band.coarseData=coarse.data;band.coarseVariance=coarse.variance;band.coarseValidity=coarse.validity;} + bands.push(band);diagnostics.push({name,validFraction:valid/(W*H),sourcePsfArcsec:psf,targetPsfArcsec:18,sources:sources.map(t=>({id:t.id,offsetMJySr:t.offset})),compactSources:points});console.log('IR_BAND_REPROJECTED',JSON.stringify({name,validFraction:valid/(W*H),targetPsfArcsec:18})); + } + const heating=requireRecord(JSON.parse(await readFile('.local/infrared/heating/heating-coefficients.json','utf8'))),heatStars=requireArray(heating.stars).map(v=>requireRecord(v)),norm=requireFiniteNumber(heating.normalizationPowerWPerH),parameters=requireRecord(JSON.parse(await readFile('src/objects/milky-way-pleiades-dust/source/parameters.json','utf8'))),col=requireRecord(parameters.columnPrior),median=requireFiniteNumber(col.nearRampEbvMedian),p90=requireFiniteNumber(col.nearRampEbvP90),NHprior=new Float32Array(W*H),fcoarse=new Float32Array(W*H),Ustar0=new Float32Array(W*H),Ustar1=new Float32Array(W*H); + for(let y=0;y{const r=requireRecord(JSON.parse(await readFile(`${root}/ir-intake.json`,'utf8'))),width=requireFiniteNumber(r.width),height=requireFiniteNumber(r.height),h=requireRecord(r.header),header:FitsHeader={};for(const[k,v]of Object.entries(h)){if(typeof v!=='number'&&typeof v!=='string'&&typeof v!=='boolean'&&v!==undefined)throw Error('Header');header[k]=v;}const bands:IrBand[]=[];for(const name of ['WISE3','WISE4','MIPS24','MIPS70']as BandName[]){const b:IrBand={name,data:await f32(`${root}/${name}-data.f32`),variance:await f32(`${root}/${name}-variance.f32`),validity:await readFile(`${root}/${name}-validity.u8`)};if(name==='MIPS70'){b.coarseData=await f32(`${root}/${name}-coarse.f32`);b.coarseValidity=await readFile(`${root}/${name}-coarse-validity.u8`);b.coarseVariance=await f32(`${root}/${name}-coarse-variance.f32`);}bands.push(b);}return {width,height,header,bands,NHprior:await f32(`${root}/NHprior.f32`),fcoarse:await f32(`${root}/fcoarse.f32`),Ustar0:await f32(`${root}/Ustar0.f32`),Ustar1:await f32(`${root}/Ustar1.f32`)};} diff --git a/packages/bake/authoring/m45/dust/column/map.mts b/packages/bake/authoring/m45/dust/column/map.mts new file mode 100644 index 00000000000..c9915cbb7d3 --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/map.mts @@ -0,0 +1,21 @@ +import {readFile,writeFile,mkdir} from 'node:fs/promises'; +import {dirname} from 'node:path'; +import {requireRecord,requireFiniteNumber} from '@cssearth/core'; +import {skyProjection,type FitsHeader} from '@cssearth/fits'; +import {f32} from './intake.mts'; +function header(v:unknown):FitsHeader{const r=requireRecord(v),out:FitsHeader={};for(const[k,x]of Object.entries(r)){if(typeof x!=='string'&&typeof x!=='number'&&typeof x!=='boolean'&&x!==undefined)throw Error('Invalid WCS header');out[k]=x;}return out;} +export interface ColumnMap {width:number;height:number;projection:ReturnType;NH:Float32Array;prior:Float32Array;f:Float32Array;alpha:Float32Array;metadata:Record} +export async function loadColumnMap(root='src/objects/milky-way-pleiades-dust/source/inputs/column',nhOverride?:Float32Array,options:{respectProcessingBoundary?:boolean;transitionPixels?:number;assumptionsPath?:string}={}):Promise{const intake=requireRecord(JSON.parse(await readFile(`${root}/ir-intake.json`,'utf8'))),width=requireFiniteNumber(intake.width),height=requireFiniteNumber(intake.height),NH=nhOverride?.slice()??await f32(`${root}/column-NH.f32`),prior=await f32(`${root}/NHprior.f32`),f=await f32(`${root}/fcoarse.f32`),valids=await Promise.all(['WISE3','WISE4','MIPS24'].map(n=>readFile(`${root}/${n}-validity.u8`)));if(NH.length!==width*height||prior.length!==NH.length||f.length!==NH.length)throw Error('Column shapes'); + const n=NH.length,support=Uint8Array.from(NH,(_,i)=>valids.reduce((sum,a)=>sum+Number(a[i]!>0),0)>=2?1:0),outside=new Uint8Array(n),queue=new Uint32Array(n);let head=0,tail=0; + const add=(p:number)=>{if(!support[p]&&!outside[p]){outside[p]=1;queue[tail++]=p;}}; + for(let x=0;x0)add(p-1);if(x0)add(p-width);if(yMath.log(Math.max(v,1e17))); + for(let iteration=0;iteration<180;iteration++)for(const p of fill){const x=p%width,y=Math.floor(p/width);if(x===0||y===0||x===width-1||y===height-1)continue;logs[p]=(logs[p-1]!+logs[p+1]!+logs[p-width]!+logs[p+width]!)/4;} + for(const p of fill)NH[p]=Math.exp(logs[p]!); + const distance=Float32Array.from(outside,v=>v?0:1e6);if(options.respectProcessingBoundary){for(let x=0;x{if(q>=0&&q0)relax(p,p-1,1);if(y>0)relax(p,p-width,1);if(x>0&&y>0)relax(p,p-width-1,Math.SQRT2);} + for(let y=height-1;y>=0;y--)for(let x=width-1;x>=0;x--){const p=y*width+x;if(xMath.max(0,Math.min(1,d/transitionPixels))),metadata={IRSupportedAtLeastTwoFineBands:fineCount,IRUnsupported:n-fineCount,internalMissingPixelsInterpolated:fill.length,coreInterpolation:'180 fixed Gauss-Seidel steps on logNH within internal IR-only gaps; never optical pixels; still unknown observationally',outerTransitionArcsec:transitionPixels*3,respectProcessingBoundary:options.respectProcessingBoundary??false,transition:'IR detail merges into the coarse extinction prior at data coverage boundaries; no dust/light cutoff',absoluteColumn:'DL07-conditional NH with external extinction prior; not a unique density or geometry measurement'}; + const destination=options.assumptionsPath??(options.respectProcessingBoundary?'src/objects/milky-way-pleiades-dust/source/inputs/isrf/column-field-assumptions.json':`${root}/column-field-assumptions.json`);await mkdir(dirname(destination),{recursive:true});await writeFile(destination,JSON.stringify(metadata,null,2)+'\n');return {width,height,projection:skyProjection(header(intake.header)),NH,prior,f,alpha,metadata};} diff --git a/packages/bake/authoring/m45/dust/column/prepare.mts b/packages/bake/authoring/m45/dust/column/prepare.mts new file mode 100644 index 00000000000..929f6398084 --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/prepare.mts @@ -0,0 +1,9 @@ +import {writeFile,mkdir} from 'node:fs/promises'; +import {loadCube} from './load-cube.mts'; +import {loadInputs} from '../physics/config.mts'; +import {fitColumn,columnFitPrototypePilot} from './fit.mts'; +const root='src/objects/milky-way-pleiades-dust/source/inputs/column';await mkdir(root,{recursive:true}); +const inputs=await loadInputs(),pilot=await columnFitPrototypePilot(inputs),fit=await fitColumn(await loadCube(root),inputs); +await writeFile(`${root}/column-NH.f32`,Buffer.from(fit.NH.buffer));await writeFile(`${root}/column-validity.u8`,fit.validity); +await writeFile(`${root}/column-fit.json`,JSON.stringify({success:true,metadata:fit.metadata,pilot},null,2)+'\n'); +console.log('PLEIADES_COLUMN_READY'); diff --git a/packages/bake/authoring/m45/dust/column/types.mts b/packages/bake/authoring/m45/dust/column/types.mts new file mode 100644 index 00000000000..93b16df4e0f --- /dev/null +++ b/packages/bake/authoring/m45/dust/column/types.mts @@ -0,0 +1,5 @@ +import type {FitsHeader} from '@cssearth/fits'; +export type BandName='WISE3'|'WISE4'|'MIPS24'|'MIPS70'; +export interface IrBand {name:BandName;data:Float32Array;variance:Float32Array;validity:Uint8Array;coarseData?:Float32Array;coarseVariance?:Float32Array;coarseValidity?:Uint8Array} +export interface IrCube {width:number;height:number;header:FitsHeader;bands:IrBand[];fcoarse:Float32Array;NHprior:Float32Array;Ustar0:Float32Array;Ustar1:Float32Array;heatingNodes?:{weights:number[];layers:[Float32Array[],Float32Array[]]}} +export interface ColumnResult {NH:Float32Array;validity:Uint8Array;metadata:Record} diff --git a/packages/bake/authoring/m45/dust/field/density.mts b/packages/bake/authoring/m45/dust/field/density.mts new file mode 100644 index 00000000000..af718685dbc --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/density.mts @@ -0,0 +1,40 @@ +import {requireFiniteNumber,requireRecord} from '@cssearth/core'; +import {skyProjection,type FitsHeader} from '@cssearth/fits'; +import {loadInputs} from '../physics/config.mts'; +import {loadColumnMap} from '../column/map.mts'; +import {PC,type Inputs,type Vec} from '../physics/types.mts'; +import {loadDepthPrior,cavityModel} from './depth-prior.mts'; +import {grid,position,sample,smooth,json,f32,vector,imageSample,type Grid} from './grid.mts'; + +const GAL_TO_ICRS=[[-.0548755604162154,.4941094278755837,-.8676661490190047],[-.873437090234885,-.4448296299600112,-.1980763734312015],[-.4838350155487132,.7469822444972189,.4559837761750669]]; +const CXV=4.983382167689161e-22; +export interface Field {inputs:Inputs;bounds:{min:Vec;max:Vec};density(x:number,y:number,z:number):number;near(x:number,y:number,z:number):number;far(x:number,y:number,z:number):number;removed(x:number,y:number,z:number):number;raw(x:number,y:number,z:number):number;metadata:Record} +function fitsHeader(raw:unknown):FitsHeader{const r=requireRecord(raw),h:FitsHeader={};for(const[k,v]of Object.entries(r)){if(typeof v!=='string'&&typeof v!=='number'&&typeof v!=='boolean'&&v!==undefined)throw Error('FITS header');h[k]=v;}return h;} +export async function createField():Promise{ + const inputs=await loadInputs(),prior=await loadDepthPrior(),cavities=cavityModel(inputs),r=inputs.reference; + const record=await json('src/objects/milky-way-pleiades-dust/source/inputs/wide-science-grid.json'),shape=vector(record.shape),origin=vector(record.originGalacticPc),data=await f32('src/objects/milky-way-pleiades-dust/source/inputs/edenhofer-wide-density.f32');if(data.length!==shape[0]*shape[1]*shape[2])throw Error('Wide shape'); + const toGal=(v:Vec):Vec=>[0,1,2].map(a=>v[0]*GAL_TO_ICRS[0]![a]!+v[1]*GAL_TO_ICRS[1]![a]!+v[2]*GAL_TO_ICRS[2]![a]!) as Vec; + const east=toGal(r.east),north=toGal(r.north),normal=toGal(r.normal),base=normal.map((v,i)=>136*v-origin[i]!); + const raw=(x:number,y:number,z:number):number=>{const p=[base[0]!+east[0]*x+north[0]*y+normal[0]*z,base[1]!+east[1]*x+north[1]*y+normal[1]*z,base[2]!+east[2]*x+north[2]*y+normal[2]*z];if(p.some((v,a)=>v<0||v>shape[a]!-1))return 0;const low=p.map((v,a)=>Math.min(shape[a]!-2,Math.floor(v))),t=p.map((v,a)=>v-low[a]!);let value=0;for(let i=0;i<2;i++)for(let j=0;j<2;j++)for(let k=0;k<2;k++)value+=data[((low[0]!+i)*shape[1]+low[1]!+j)*shape[2]+low[2]!+k]!*(i?t[0]!:1-t[0]!)*(j?t[1]!:1-t[1]!)*(k?t[2]!:1-t[2]!);return Math.max(0,value);}; + const bounds:{min:Vec;max:Vec}={min:[Infinity,Infinity,Infinity],max:[-Infinity,-Infinity,-Infinity]};for(let corner=0;corner<8;corner++){const g:Vec=[origin[0]+(corner&1?shape[0]-1:0),origin[1]+(corner&2?shape[1]-1:0),origin[2]+(corner&4?shape[2]-1:0)],icrs=GAL_TO_ICRS.map(row=>row.reduce((s,v,k)=>s+v*g[k]!,0)),local=[icrs.reduce((s,v,k)=>s+v*r.east[k]!,0),icrs.reduce((s,v,k)=>s+v*r.north[k]!,0),icrs.reduce((s,v,k)=>s+v*r.normal[k]!,0)-136];for(let a=0;a<3;a++){bounds.min[a]=Math.min(bounds.min[a]!,local[a]!);bounds.max[a]=Math.max(bounds.max[a]!,local[a]!);}} + const nearWeight=(x:number,y:number,z:number)=>{const f=136/(136+z);return smooth((12-Math.abs(x*f))/2)*smooth((12-Math.abs(y*f))/2)*smooth((z+16)/2)*smooth((12-z)/2);}; + const coarse=grid([-12,-12,0],[12,12,1],[193,193,2]);const probe=new Float64Array(1); + for(let y=0;y{const p=[136*r.normal[0]+x*r.east[0]+y*r.north[0],136*r.normal[1]+x*r.east[1]+y*r.north[1],136*r.normal[2]+x*r.east[2]+y*r.north[2]],d=Math.hypot(...p);return[Math.atan2(p[1]!,p[0]!)*180/Math.PI,Math.asin(p[2]!/d)*180/Math.PI];}; + for(let y=0;y<193;y++)for(let x=0;x<193;x++){const p=position(coarse,x,y,0),uv=irWcs.pixelOf(...sky(p[0],p[1]));let heat=1;for(const star of inputs.stars){const d2=(p[0]-star.at[0])**2+(p[1]-star.at[1])**2+star.at[2]**2;heat+=star.luminositySolar*3.828e26/(4*Math.PI*Math.max(d2,.01)*PC*PC)/(299792458*1.043e-13);}const temperature=18*Math.pow(heat,1/6),thermal=1/Math.expm1(143.877/temperature);irRatio[y*193+x]=(uv?imageSample(iris,iw,ih,...uv):0)/thermal;} + for(let y=0;y<193;y++)for(let x=0;x<193;x++){let sum=0,n=0;for(let j=Math.max(0,y-4);j<=Math.min(192,y+4);j++)for(let i=Math.max(0,x-4);i<=Math.min(192,x+4);i++){sum+=irRatio[j*193+i]!;n++;}const relative=sum>0?irRatio[y*193+x]!/(sum/n):1;const o=y*193+x;coarse.data[o]!*=relative;coarse.data[193*193+o]=coarse.data[o]!;} + const column=await loadColumnMap('src/objects/milky-way-pleiades-dust/source/inputs/column',undefined,{respectProcessingBoundary:true,transitionPixels:506,assumptionsPath:'.local/pleiades-dust/output/column-assumptions.json'}),fineN=2048,fine=new Float32Array(fineN*fineN); + for(let y=0;y{if(Math.abs(x)<4&&Math.abs(y)<4)return imageSample(fine,fineN,fineN,(x+4)*fineN/8-.5,(y+4)*fineN/8-.5);sample(coarse,x,y,.5,probe);return probe[0]!;}; + const cavity=grid([-4,-4,-6],[4,4,6],[129,129,193]);for(let z=0;z{if(inputs.stars.some(s=>(x-s.at[0])**2+(y-s.at[1])**2+(z-s.at[2])**2<.09))return cavities.factor(x,y,z,.015625);if(Math.abs(x)>4||Math.abs(y)>4||Math.abs(z)>6)return cavities.factor(x,y,z,.125);sample(cavity,x,y,z,cavityProbe);return cavityProbe[0]!;}; + const norm=grid([-12,-12,0],[12,12,1],[129,129,2]);for(let y=0;y<129;y++)for(let x=0;x<129;x++){const p=position(norm,x,y,0);let sum=0;for(let z=-15.875;z<12;z+=.25)sum+=prior.sampleRay(p[0],p[1],z)*cavityAt(p[0]*(136+z)/136,p[1]*(136+z)/136,z)*.25;const q=sum>1e-12?1/sum:0;norm.data[y*129+x]=q;norm.data[129*129+y*129+x]=q;} + const normalization=new Float64Array(1),near=(x:number,y:number,z:number)=>{const w=nearWeight(x,y,z);if(w===0)return 0;const f=136/(136+z);sample(norm,x*f,y*f,.5,normalization);return Math.max(0,columnAt(x*f,y*f)*prior.sample(x,y,z)*cavityAt(x,y,z)*normalization[0]!*w);},removed=(x:number,y:number,z:number)=>raw(x,y,z)*nearWeight(x,y,z),far=(x:number,y:number,z:number)=>raw(x,y,z)*(1-nearWeight(x,y,z)); + for(const star of inputs.stars)if(near(...star.at)>1e-15)throw Error('Avoidance sampling must retain the analytic stellar-center vacuum'); + console.log('PLEIADES_FIELD_READY',JSON.stringify({finePixels:fine.length,cavityVoxels:cavity.data.length})); + return {inputs,bounds,raw,near,far,removed,density:(x,y,z)=>near(x,y,z)+far(x,y,z),metadata:{depth:prior.metadata,cavities:cavities.metadata,column:column.metadata,columnSource:'infrared conditional IR column retained at2048samples across8pc; broad column from native Edenhofer',surroundStructure:'IRIS100um relative I/Bnu(T),18K U^(1/6) equilibrium approximation; normalized to a1pc localmean and coarse measured column; not absolute IR dust mass',nearResolutionRegionPc:{min:[-12,-12,-16],max:[12,12,12]},transition:'2pc observational-resolution partition; no illumination cutoff; all dust has stellar inverse-square and uniform publishedISRF',nearStellarAvoidanceSampling:'Direct cold-flow evaluation within0.3pc of any illuminating star, finite0.015625pc cells; cached elsewhere; stellar-center vacuum required by constructor',columnRenormalization:'Per-sightline compensation of conditional avoidance redistribution, sampled on0.1875pcXY/0.25pcZ; finite near-boundary partition left explicit',limitations:['Map profile breadth includes reconstruction uncertainty; not measured physical thickness.','Multiple scattering and detailed grain-temperature distributions omitted; incomingISRF shielding is prepared by the transport owner.','IRIS has4.3arcmin beam and no delivered quality/uncertainty mask; relative structure only.']}}; +} diff --git a/packages/bake/authoring/m45/dust/field/depth-prior.mts b/packages/bake/authoring/m45/dust/field/depth-prior.mts new file mode 100644 index 00000000000..44b58d12092 --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/depth-prior.mts @@ -0,0 +1,80 @@ +import {readFile} from 'node:fs/promises'; +import {resolve} from 'node:path'; + +type Vec=readonly[number,number,number]; +type Json=Record; +const record=(v:unknown):Json=>{if(!v||typeof v!=='object'||Array.isArray(v))throw new TypeError('Expected record.');return v as Json;}; +const finite=(v:unknown):number=>{if(typeof v!=='number'||!Number.isFinite(v))throw new TypeError('Expected finite number.');return v;}; +const positive=(v:unknown):number=>{const n=finite(v);if(!(n>0))throw new RangeError('Expected positive number.');return n;}; +const vector=(v:unknown):Vec=>{if(!Array.isArray(v)||v.length!==3)throw new TypeError('Expected three-vector.');return [finite(v[0]),finite(v[1]),finite(v[2])];}; +export interface DepthPrior { + /** Physical local Cartesian coordinates, in pc relative to the136pc reference. */ + sample(x:number,y:number,z:number):number; + /** Observer-ray coordinates: east/north intersected with the136pc plane. */ + sampleRay(xAt136:number,yAt136:number,z:number):number; + metadata:Json; +} +export async function loadDepthPrior(directory=resolve('src/objects/milky-way-pleiades-dust/source')):Promise{ + const header=record(JSON.parse(await readFile(resolve(directory,'depth-profiles.json'),'utf8'))),g=record(header.grid),coordinate=record(header.coordinate); + if(header.schema!=='pleiades-normal-depth-grid@1'||header.executionComplete!==true)throw new TypeError('Unfinished or unsupported depth prior.'); + const nx=finite(g.nx),ny=finite(g.ny),nz=finite(g.nz),min=vector(g.min),step=vector(g.step),reference=positive(coordinate.referenceNormalDepthPc); + for(const n of [nx,ny,nz])if(!Number.isSafeInteger(n)||n<2)throw new RangeError('Invalid grid dimension.'); + step.forEach(positive); + const primary=header.primary;if(typeof primary!=='string'||primary.includes('..')||primary.includes('/'))throw new TypeError('Invalid local primary file.'); + const values=header.values;if(values!==undefined&&(!Array.isArray(values)||values.length!==nx*ny*nz))throw new RangeError('Depth-prior sample count mismatch.'); + const buffer=values===undefined?await readFile(resolve(directory,primary)):null;if(buffer&&buffer.length!==nx*ny*nz*4)throw new RangeError('Depth-prior byte count mismatch.'); + const data=new Float32Array(nx*ny*nz);for(let i=0;i=0))throw new RangeError('Negative prior.');data[i]=value;} + // The transport promises complete sight lines and unit normal-depth integrals. + for(let p=0;p2e-5)throw new RangeError('Unnormalized/incomplete primary sight line.');} + const sampleRay=(x:number,y:number,z:number):number=>{ + const f=[(finite(x)-min[0])/step[0],(finite(y)-min[1])/step[1],(finite(z)-min[2])/step[2]],dims=[nx,ny,nz]; + if(f.some((v,i)=>v<0||v>dims[i]!-1))return 0; + const base=f.map((v,i)=>Math.min(dims[i]!-2,Math.floor(v))),t=f.map((v,i)=>v-base[i]!);let value=0; + for(let dy=0;dy<2;dy++)for(let dx=0;dx<2;dx++)for(let dz=0;dz<2;dz++)value+=data[((base[1]!+dy)*nx+base[0]!+dx)*nz+base[2]!+dz]!*(dx?t[0]!:1-t[0]!)*(dy?t[1]!:1-t[1]!)*(dz?t[2]!:1-t[2]!); + return value; + }; + const metadataHeader={...header};delete metadataHeader.values; + return {sampleRay,sample:(x,y,z)=>{const depth=reference+finite(z);if(!(depth>0))return 0;return sampleRay(finite(x)*reference/depth,finite(y)*reference/depth,z);},metadata:{...metadataHeader,reader:'trilinear node interpolation; physical sample projects its x/y onto the observer-ray chart at136pc',normalizationCaution:'Returned profile is per normal pc. If multiplying by an observed radial column, multiply by dot(ray,normal) to obtain physical density per radial pc, or explicitly renormalize the integrated ray.',outsideSupport:'returns0; caller must preserve/match wide-source attenuation. This is not a physical cloud edge.'}}; +} + +export interface CavityStar {name:string;at:Vec;luminositySolar:number;massSolar:number} +export interface CavityGrain {radiusMicron:number;weight:number;materialDensityGcm3:number;qPr:number} +export interface CavityInputs {stars:readonly CavityStar[];grains:readonly CavityGrain[];upstream:Vec;speedKmS:number} +export interface CavityOptions {radiation?:boolean} +export interface CavityModel {factor(x:number,y:number,z:number,cellPc:number):number;metadata:Json} +interface CombinedStar {names:string[];at:Vec;luminositySolar:number;massSolar:number} +interface Population {weight:number;grain:number;speedKmS:number;radiiPc:number[]} +const SPEED_OFFSETS=[-1,0,1] as const,SPEED_WEIGHTS=[.25,.5,.25] as const; +const G_PC_KMS=4.30091727e-3; +// Exact primitive/finite-cell average copied from the Pleiades offline fields owner. +// F'(A)=.5(sqrt(A)+1/sqrt(A)), outside the excluded A<=0 region. +function densityPrimitive(a:number):number{if(a<=0)return 0;if(a>=1)return 4/3+a-1;return Math.sqrt(a)*(1+a/3);} +function averageColdDensity(a:number,halfWidth:number):number{ + if(a+halfWidth<=0)return 0; + if(halfWidth<1e-7&&a>halfWidth*10){const q=Math.sqrt(a);return .5*(q+1/q);} + const width=Math.max(halfWidth,1e-10);return (densityPrimitive(a+width)-densityPrimitive(a-width))/(2*width); +} +export function cavityModel(inputs:CavityInputs,options:CavityOptions={}):CavityModel{ + const u=vector(inputs.upstream),speed=positive(inputs.speedKmS);if(Math.abs(Math.hypot(...u)-1)>1e-8)throw new RangeError('Upstream must be a unit vector opposing the incoming velocity.'); + if(speed<=1)throw new RangeError('Incoming speed must exceed adopted1km/s dispersion.'); + if(!inputs.stars.length||!inputs.grains.length)throw new RangeError('Stars and grain populations are required.'); + const groups:CombinedStar[]=[]; + for(const star of inputs.stars){const at=vector(star.at),L=positive(star.luminositySolar),M=positive(star.massSolar);let group=groups.find(s=>Math.hypot(s.at[0]-at[0],s.at[1]-at[1],s.at[2]-at[2])<1e-9);if(!group){group={names:[],at,luminositySolar:0,massSolar:0};groups.push(group);}group.names.push(star.name);group.luminositySolar+=L;group.massSolar+=M;} + let totalGrainWeight=0;for(const grain of inputs.grains){positive(grain.radiusMicron);positive(grain.weight);positive(grain.materialDensityGcm3);if(finite(grain.qPr)<0)throw new RangeError('Negative Qpr.');totalGrainWeight+=grain.weight;} + const radiation=options.radiation!==false,ensemble:Population[]=[]; + for(const [grainIndex,grain] of inputs.grains.entries())for(const [speedIndex,offset] of SPEED_OFFSETS.entries()){ + const v=speed+offset,radiiPc=groups.map(s=>2*G_PC_KMS*Math.max(0,(radiation?.574*s.luminositySolar*grain.qPr/(grain.materialDensityGcm3*grain.radiusMicron):0)-s.massSolar)/(v*v)); + ensemble.push({grain:grainIndex,speedKmS:v,weight:grain.weight/totalGrainWeight*SPEED_WEIGHTS[speedIndex]!,radiiPc}); + } + return {factor:(x,y,z,cellPc)=>{ + finite(x);finite(y);finite(z);positive(cellPc);if(!radiation)return 1; + const w:number[]=[],halfW:number[]=[]; + for(const star of groups){const dx=x-star.at[0],dy=y-star.at[1],dz=z-star.at[2],r=Math.hypot(dx,dy,dz);w.push(Math.max(0,r+dx*u[0]+dy*u[1]+dz*u[2]));halfW.push(r>0?.5*cellPc*(Math.abs(dx/r+u[0])+Math.abs(dy/r+u[1])+Math.abs(dz/r+u[2])):0);} + let factor=0; + for(const population of ensemble){let worstA=1,interval=0,excluded=false; + for(let j=0;j0',forceUnits:'G=4.30091727e−3 pc(km/s)²/solarMass',radiationEnabled:radiation,combinedStars:groups,grainPopulations:inputs.grains,speedKmS:speed,speedOffsetsKmS:[...SPEED_OFFSETS],speedWeights:[...SPEED_WEIGHTS],upstream:[...u],ensemble,assumptions:['Grain sizes/weights/material density and Qpr are adopted unless supplied with specific measurements.','The conditional Herbig flow is not measured for the whole foreground cloud; speed dispersion±1km/s is adopted.','Cold collisionless flow; gas drag and magnetic coupling omitted.','The finite caustic uses the Pleiades cell-integrated primitive; cellPc is an isotropic physical cell size.','Coincident stellar components have summed force before their avoidance radius is computed.','No column compensation is applied here; the caller owns any observational normalization.','Radiation-disabled or non-repulsive populations have factor1; gravitational focusing is omitted.']}}; +} diff --git a/packages/bake/authoring/m45/dust/field/foreground.mts b/packages/bake/authoring/m45/dust/field/foreground.mts new file mode 100644 index 00000000000..6c5644fb5a0 --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/foreground.mts @@ -0,0 +1,35 @@ +import type { Vec } from '../physics/types.mts'; + +/** Local z is normal depth minus136pc; the solar origin approximates Earth's position. */ +export const EARTH_EYE_PC: Vec = [0, 0, -136]; + +interface ForegroundField { + inputs: { stars: readonly { name: string; at: readonly [number, number, number] }[] }; + near(x: number, y: number, z: number): number; + density(x: number, y: number, z: number): number; +} + +export function foregroundSelection(field: ForegroundField) { + if (!field.inputs.stars.length) throw new Error('Illuminating stars are required'); + const starPlaneZPc = Math.min(...field.inputs.stars.map(star => star.at[2])); + if (!Number.isFinite(starPlaneZPc) || starPlaneZPc <= EARTH_EYE_PC[2]) throw new Error('Invalid foreground interval'); + const selected = (x: number, y: number, z: number) => z > EARTH_EYE_PC[2] && z < starPlaneZPc ? field.near(x, y, z) : 0; + const remaining = (x: number, y: number, z: number) => Math.max(0, field.density(x, y, z) - selected(x, y, z)); + return { + earthEye: [...EARTH_EYE_PC] as Vec, starPlaneZPc, selected, remaining, + metadata: { + method: 'Select existing near-cloud material strictly between the fixed Earth origin and every adopted illuminating-star normal depth', + coordinate: 'pc east/north/away from Earth; z=normal depth minus136pc', + earthEyePc: [...EARTH_EYE_PC], starPlaneZPc, + stellarNormalDepthsPc: field.inputs.stars.map(star => ({ name: star.name, normalDepthPc: 136 + star.at[2] })), + densityModified: false, selectedColumnRenormalized: false, backgroundMaterialMovedForward: false, + assumptions: [ + 'The adopted bright-star136.7pc normal-depth plane is a conditional realization, not measured individual distances.', + 'The foreground restriction selects a reflection component; it is not evidence of a sharp physical cloud boundary.', + 'The solar origin is used for the Earth reference; the AU-scale orbital offset is unresolved by these dust data.', + 'Reference Earth illumination and outgoing attenuation are frozen for all preview cameras by the fixed reference model; this is not angle-correct radiative transfer.', + 'All other dust contributes only fixed Galactic illumination; the full density remains in attenuation caches.' + ] + } + }; +} diff --git a/packages/bake/authoring/m45/dust/field/foreground.test.mts b/packages/bake/authoring/m45/dust/field/foreground.test.mts new file mode 100644 index 00000000000..229aaa4f956 --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/foreground.test.mts @@ -0,0 +1,17 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { foregroundSelection } from './foreground.mts'; + +test('one fixed foreground component excludes rear material without renormalizing or losing ambient density', () => { + const inputs = { stars: [{ name: 'A', at: [1, 0, .7] as const }, { name: 'B', at: [-1, 0, .7] as const }] }; + const field = { inputs, near: () => 2, density: () => 3 }; + const selection = foregroundSelection(field); + for (const z of [-137, -136, -10, 0, .699, .7, 2]) { + const expected = z > -136 && z < .7 ? 2 : 0; + assert.equal(selection.selected(0, 0, z), expected); + assert.equal(selection.selected(0, 0, z) + selection.remaining(0, 0, z), 3); + } + assert.equal(selection.metadata.selectedColumnRenormalized, false); + assert.deepEqual(selection.earthEye, [0, 0, -136]); + assert.throws(() => foregroundSelection({ ...field, inputs: { ...inputs, stars: [] } }), /stars are required/); +}); diff --git a/packages/bake/authoring/m45/dust/field/grid.mts b/packages/bake/authoring/m45/dust/field/grid.mts new file mode 100644 index 00000000000..0ddc9472b44 --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/grid.mts @@ -0,0 +1,18 @@ +import {readFile} from 'node:fs/promises'; +import {requireArray,requireFiniteNumber,requireRecord} from '@cssearth/core'; +import type {Vec} from '../physics/types.mts'; + +export interface Grid {min:Vec;max:Vec;shape:Vec;channels:number;data:Float32Array} +export const smooth=(v:number)=>{const t=Math.max(0,Math.min(1,v));return t*t*(3-2*t);}; +export function vector(v:unknown):Vec {const a=requireArray(v).map(n=>requireFiniteNumber(n));if(a.length!==3)throw Error('Expected XYZ');return[a[0]!,a[1]!,a[2]!];} +export async function json(path:string):Promise> {return requireRecord(JSON.parse(await readFile(path,'utf8')));} +export async function f32(path:string):Promise{const b=await readFile(path);if(b.length%4)throw Error('F32 byte count');return Float32Array.from({length:b.length/4},(_,i)=>b.readFloatLE(i*4));} +export function grid(min:Vec,max:Vec,shape:Vec,channels=1):Grid {return{min,max,shape,channels,data:new Float32Array(shape[0]*shape[1]*shape[2]*channels)};} +export function position(g:Grid,ix:number,iy:number,iz:number):Vec {return [g.min[0]+ix/(g.shape[0]-1)*(g.max[0]-g.min[0]),g.min[1]+iy/(g.shape[1]-1)*(g.max[1]-g.min[1]),g.min[2]+iz/(g.shape[2]-1)*(g.max[2]-g.min[2])];} +export function sample(g:Grid,x:number,y:number,z:number,out:Float64Array):void { + const fx=(x-g.min[0])/(g.max[0]-g.min[0])*(g.shape[0]-1),fy=(y-g.min[1])/(g.max[1]-g.min[1])*(g.shape[1]-1),fz=(z-g.min[2])/(g.max[2]-g.min[2])*(g.shape[2]-1);out.fill(0); + if(fx<0||fy<0||fz<0||fx>g.shape[0]-1||fy>g.shape[1]-1||fz>g.shape[2]-1)return; + const ix=Math.min(g.shape[0]-2,Math.floor(fx)),iy=Math.min(g.shape[1]-2,Math.floor(fy)),iz=Math.min(g.shape[2]-2,Math.floor(fz)),u=fx-ix,v=fy-iy,w=fz-iz; + for(let k=0;k<2;k++)for(let j=0;j<2;j++)for(let i=0;i<2;i++){const q=(i?u:1-u)*(j?v:1-v)*(k?w:1-w),o=(((iz+k)*g.shape[1]+iy+j)*g.shape[0]+ix+i)*g.channels;for(let c=0;cw-1||y>h-1)return 0;const ix=Math.min(w-2,Math.floor(x)),iy=Math.min(h-2,Math.floor(y)),u=x-ix,v=y-iy,o=iy*w+ix;return(data[o]!*(1-u)+data[o+1]!*u)*(1-v)+(data[o+w]!*(1-u)+data[o+w+1]!*u)*v;} diff --git a/packages/bake/authoring/m45/dust/field/prepare-depth-record.mts b/packages/bake/authoring/m45/dust/field/prepare-depth-record.mts new file mode 100644 index 00000000000..a45661679f3 --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/prepare-depth-record.mts @@ -0,0 +1,11 @@ +import {mkdir,readFile,writeFile} from 'node:fs/promises'; +import {requireRecord,requireArray,requireFiniteNumber} from '@cssearth/core'; +const source='src/objects/milky-way-pleiades-dust/source/inputs/depth',destination='src/objects/milky-way-pleiades-dust/source'; +const record=requireRecord(JSON.parse(await readFile(`${source}/grid.json`,'utf8'))),g=requireRecord(record.grid),count=['nx','ny','nz'].reduce((n,key)=>n*requireFiniteNumber(g[key]),1),bytes=await readFile(`${source}/edenhofer-depth-prior.f32`); +if(bytes.length!==count*4)throw Error('Depth-prior shape'); +const values=Array.from({length:count},(_,i)=>bytes.readFloatLE(i*4));if(values.some(v=>!Number.isFinite(v)||v<0))throw Error('Nonphysical prior'); +await mkdir(destination,{recursive:true}); +const metadata={...record};delete metadata.seconds; +await writeFile(`${destination}/depth-profiles.json`,JSON.stringify({...metadata,schema:'pleiades-normal-depth-grid@1',primary:'values',generator:'packages/bake/authoring/m45/dust/field/prepare-depth-record.mts',valueEncoding:'Native-extracted conditional normalized Float32 samples, preserved exactly as JSON numbers; not a measured physical-thickness field.',values},null,2)+'\n'); +const replay=requireRecord(JSON.parse(await readFile(`${destination}/depth-profiles.json`,'utf8'))),read=requireArray(replay.values).map(n=>requireFiniteNumber(n));if(read.some((v,i)=>v!==values[i]))throw Error('Depth record changed samples'); +console.log('PLEIADES_DEPTH_SOURCE_PRESERVED',JSON.stringify({samples:count,bytes:Buffer.byteLength(JSON.stringify(replay)),sameFloat32Samples:true})); diff --git a/packages/bake/authoring/m45/dust/field/transmission.mts b/packages/bake/authoring/m45/dust/field/transmission.mts new file mode 100644 index 00000000000..fecad87a1bc --- /dev/null +++ b/packages/bake/authoring/m45/dust/field/transmission.mts @@ -0,0 +1,81 @@ +import {mkdir,readFile,writeFile} from 'node:fs/promises'; +import {resolve} from 'node:path'; +import {pathToFileURL} from 'node:url'; +import assert from 'node:assert/strict'; +import {worldRotationFromQuaternion,rotateWorldPosition} from '@cssearth/engine'; +import {parsePointTransmission,PREPARED_POINT_TRANSMISSION_SCHEMA,type PreparedBank} from '@cssearth/objects'; +import {packPreparedBank,unpackPreparedBank} from '@cssearth/objects/node'; +import {PC,type Vec} from '../physics/types.mts'; +import {createField,type Field} from './density.mts'; + +const BASELINE='src/objects/milky-way-pleiades-dust/source/inputs/coarse-transmission.bin'; +const CURRENT='src/objects/milky-way-pleiades-dust/prepared/point-transmission.bin'; +const CONFIG={min:[-13.2,-13.2,-16],max:[13.2,13.2,12],shape:[107,107,113],maximumRayStepPc:.5,cacheNominalStepPc:.25,tauQuantization:1000} as const; +interface DeltaGrid {values:Float32Array;min:Vec;max:Vec;step:Vec;shape:Vec;minimum:number;maximum:number;seconds:number} +function numeric(value:unknown):number{if(typeof value!=='number'||!Number.isFinite(value))throw Error('Expected finite number');return value;} +function record(value:unknown):Record{if(!value||typeof value!=='object'||Array.isArray(value))throw Error('Expected record');return value as Record;} +function cacheDelta(field:Field):DeltaGrid{ + const start=performance.now(),min:Vec=[...CONFIG.min],max:Vec=[...CONFIG.max],shape:Vec=[...CONFIG.shape],step:Vec=[0,1,2].map(a=>(max[a]!-min[a]!)/(shape[a]!-1)) as Vec,values=new Float32Array(shape[0]*shape[1]*shape[2]);let minimum=0,maximum=0; + for(let z=0;znx-1||fy>ny-1||fz>nz-1)return 0; + const ix=Math.min(nx-2,Math.floor(fx)),iy=Math.min(ny-2,Math.floor(fy)),iz=Math.min(nz-2,Math.floor(fz)),u=fx-ix,v=fy-iy,w=fz-iz,a=g.values,k=(iz*ny+iy)*nx+ix,plane=nx*ny; + const low=(a[k]!*(1-u)+a[k+1]!*u)*(1-v)+(a[k+nx]!*(1-u)+a[k+nx+1]!*u)*v; + const high=(a[k+plane]!*(1-u)+a[k+plane+1]!*u)*(1-v)+(a[k+plane+nx]!*(1-u)+a[k+plane+nx+1]!*u)*v;return low*(1-w)+high*w; +} +function clip(eye:Vec,d:Vec,min:readonly number[],max:readonly number[]):[number,number]|null{ + let low=0,high=1;for(let a=0;a<3;a++){if(Math.abs(d[a]!)<1e-15){if(eye[a]!max[a]!)return null;}else{const v0=(min[a]!-eye[a]!)/d[a]!,v1=(max[a]!-eye[a]!)/d[a]!;low=Math.max(low,Math.min(v0,v1));high=Math.min(high,Math.max(v0,v1));}}return high>low?[low,high]:null; +} +function directRaw(field:Field,eye:Vec,target:Vec):number{ + const d:Vec=[target[0]-eye[0],target[1]-eye[1],target[2]-eye[2]],distance=Math.hypot(...d),segment=clip(eye,d,field.bounds.min,field.bounds.max);if(!segment||distance===0)return 0; + const [low,high]=segment,n=Math.max(1,Math.ceil(distance*(high-low)/.25)),ds=distance*(high-low)/n;let tau=0; + for(let j=0;j>{ + const start=performance.now(),out=pilot?'.local/pleiades-dust/pilot':'.local/pleiades-dust/bake';await mkdir(out,{recursive:true}); + const baseline=parsePointTransmission(unpackPreparedBank(await readFile(BASELINE))),palette=parsePointTransmission(unpackPreparedBank(await readFile(CURRENT))); + for(const key of ['frame','targetAxes','observerAxes','thresholds'] as const)assert.equal(JSON.stringify(baseline[key]),JSON.stringify(palette[key]),`Current/baseline ${key} mismatch`); + if(!pilot){const prior=record(JSON.parse(await readFile('.local/pleiades-dust/pilot/transmission.json','utf8')));if(prior.executionComplete!==true||prior.pilot!==true||prior.guardsPassed!==true||JSON.stringify(prior.config)!==JSON.stringify(CONFIG))throw Error('Matching positive pilot sentinel required before full transmission');} + const rotation=worldRotationFromQuaternion(baseline.frame.localToReferenceXyzw),ref=field.inputs.reference; + // Preserve Pleiades's shared frame conversion: bank units→pc, then rotation and the ICRF origin. + const local=(x:number,y:number,z:number):Vec=>{const p=rotateWorldPosition(rotation,[x*baseline.frame.metersPerUnit/PC,y*baseline.frame.metersPerUnit/PC,z*baseline.frame.metersPerUnit/PC]),q:Vec=[p[0]+baseline.frame.originM[0]/PC,p[1]+baseline.frame.originM[1]/PC,p[2]+baseline.frame.originM[2]/PC];return [q.reduce((s,v,k)=>s+v*ref.east[k]!,0),q.reduce((s,v,k)=>s+v*ref.north[k]!,0),q.reduce((s,v,k)=>s+v*ref.normal[k]!,0)-136];}; + if(Math.hypot(...local(0,0,0))>5)throw Error('Transmission origin no longer matches the cluster frame'); + const targets:Vec[]=[],observers:Vec[]=[];for(const x of baseline.targetAxes[0]!)for(const y of baseline.targetAxes[1]!)for(const z of baseline.targetAxes[2]!)targets.push(local(x,y,z));for(const x of baseline.observerAxes[0]!)for(const y of baseline.observerAxes[1]!)for(const z of baseline.observerAxes[2]!)observers.push(local(x,y,z)); + assert.equal(observers.length*targets.length,baseline.tau.length); + const g=cacheDelta(field),tau=baseline.tau.slice(),pilotObserver=Math.floor(observers.length/2),traceStart=performance.now();let changed=0,intersected=0,processed=0,minDelta=0,maxDelta=0,clampedLow=0,clampedHigh=0,minimumUnclampedTau=Infinity; + for(let oi=0;oi65.535)clampedHigh++;tau[index]=Math.round(Math.max(0,Math.min(65.535,raw))*1000);if(tau[index]!==baseline.tau[index])changed++; + } + if(oi%32===0){console.log('PLEIADES_TRANSMISSION_PROGRESS',JSON.stringify({observer:oi,total:observers.length,changed,seconds:(performance.now()-traceStart)/1000}));await new Promise(done=>setImmediate(done));} + } + const traceSeconds=(performance.now()-traceStart)/1000,baselineChecks=[],deltaChecks=[]; + let earthObserver=0;for(let oi=1;oiv-star.at[a]!))v-star.at[a]!)))closest=ti;targetIndices.add(closest);} + for(const oi of new Set([0,pilotObserver,earthObserver,observers.length-1]))for(const ti of targetIndices){const stored=baseline.tau[oi*targets.length+ti]!/1000,direct=directRaw(field,observers[oi]!,targets[ti]!);baselineChecks.push({observer:oi,target:ti,baselineTau:stored,directRawTau:direct,differenceTau:stored-direct});} + for(const ti of targetIndices){const cached=cachedDelta(g,observers[pilotObserver]!,targets[ti]!),direct=directDelta(field,observers[pilotObserver]!,targets[ti]!);deltaChecks.push({observer:pilotObserver,target:ti,cachedDeltaTau:cached,directDeltaTau:direct,differenceTau:cached-direct});} + if(!baselineChecks.some(v=>v.directRawTau>0)||!changed||processed!==(pilot?targets.length:tau.length))throw Error('Transmission numerical/coverage guard failed'); + const projectedFullTraceSeconds=pilot?traceSeconds*observers.length:traceSeconds;if(pilot&&projectedFullTraceSeconds>600)throw Error(`Transmission pilot projected ${projectedFullTraceSeconds.toFixed(1)}s exceeds600s`); + const bank:PreparedBank={schema:PREPARED_POINT_TRANSMISSION_SCHEMA,fields:{frame:baseline.frame,targetAxes:baseline.targetAxes,observerAxes:baseline.observerAxes,thresholds:baseline.thresholds},columns:{tau,colors:palette.colors.slice()}};parsePointTransmission(bank); + const destination=`${out}/point-transmission.bin`;await writeFile(destination,packPreparedBank(bank)); + const readback=parsePointTransmission(unpackPreparedBank(await readFile(destination)));assert.equal(readback.tau.length,tau.length);assert.deepEqual(readback.tau,tau);assert.deepEqual(readback.colors,palette.colors);assert.deepEqual(readback.frame,baseline.frame); + const maxAbs=(rows:{differenceTau:number}[])=>Math.max(...rows.map(v=>Math.abs(v.differenceTau))); + const result={executionComplete:true,guardsPassed:true,pilot,config:CONFIG,destination,entries:tau.length,observers:observers.length,targets:targets.length,processedEntries:processed,pilotObserver,changed,intersected,minDelta,maxDelta,clampedLow,clampedHigh,minimumUnclampedTau:Number.isFinite(minimumUnclampedTau)?minimumUnclampedTau:null,cache:{nodes:g.values.length,actualStepPc:g.step,minDeltaDensity:g.minimum,maxDeltaDensity:g.maximum,seconds:g.seconds},traceSeconds,projectedFullTraceSeconds,seconds:(performance.now()-start)/1000,baselineValidation:{directStepPc:.25,checks:baselineChecks,maxAbsDifferenceTau:maxAbs(baselineChecks),interpretation:'Direct integration uses current raw nativeEdenhofer1pc-grid density and the exact prepared observer/target nodes. Differences expose inherited baseline integration/quantization error; baseline is preserved rather than silently replaced.'},deltaValidation:{directStepPc:.125,checks:deltaChecks,maxAbsDifferenceTau:maxAbs(deltaChecks),interpretation:'Cached0.25pc density and0.5pc ray steps intentionally resolve the coarse prepared lookup; they do not resolve every IR filament or cavity.'},method:'tau_new=tau_baseline+integral(field.near−field.removed)ds; the removed component uses the exact same field partition. Prepared frames/axes/thresholds retained; colors copied byte-for-byte from optical palette.',limitations:['Observer/target lookup remains coarse; this is not a per-star new extinction measurement.','Small negative totals from inherited baseline/coarse sampling are clamped only at the final uint16 encoding and explicitly counted.','No prepared asset was overwritten; dataset installation is a separate action.']}; + await writeFile(`${out}/transmission.json`,JSON.stringify(result,null,2)+'\n');console.log('PLEIADES_TRANSMISSION_COMPLETE',JSON.stringify(result));return result; +} +if(process.argv[1]&&import.meta.url===pathToFileURL(resolve(process.argv[1])).href){const pilot=process.argv.includes('--pilot');await prepareTransmission(await createField(),{pilot});} diff --git a/packages/bake/authoring/m45/dust/geometry/patches.mts b/packages/bake/authoring/m45/dust/geometry/patches.mts new file mode 100644 index 00000000000..f010d5751ce --- /dev/null +++ b/packages/bake/authoring/m45/dust/geometry/patches.mts @@ -0,0 +1,73 @@ +import {type Vec} from '../physics/types.mts'; + +export interface Cell {id:string;center:Vec;half:Vec;kind:'core'|'surround';x:number;y:number;z:number} +export interface Axes {back:Vec;right:Vec;down:Vec} +export interface PatchBounds {u0:number;v0:number;u1:number;v1:number} +export interface Ray {eye:Vec;direction:Vec} +export interface Box {min:Vec;max:Vec} +export interface ReferenceProjection { + cell:Cell;bakeEye:Vec;eye:Vec;spanPc:number;insideCellConeApproximation:boolean; + bakedBack:Vec;bakedRight:Vec;bakedDown:Vec;cameraBack:Vec;cameraRight:Vec;cameraDown:Vec; + /** Existing CSS matrix(a,b,c,d), not an added perspective warp. */ + basisM:readonly[number,number,number,number];cellCameraDepthPc:number; + bakeRay(u:number,v:number):Ray;displayRay(u:number,v:number):Ray; + /** Affine display coordinates on the camera plane at the old cell-center depth. */ + displayPlaneXY(u:number,v:number):readonly[number,number]; +} +export interface FixedPatch { + position:Vec;diameterPc:number;axisTowardReference:Vec;bounds:PatchBounds;sourceCenterUv:readonly[number,number]; + /** Destination UVs for statically prewarping the original RGBA patch, TL/TR/BR/BL. */ + quadUv:readonly(readonly[number,number])[];cameraPlaneCorners:readonly Vec[]; + cameraDepthPc:number;densityMeanPhysicalPosition:Vec;densityAtRepresentativePoint:number; + densityColumnIntegral:number;densityWeightedCameraDepth16Pc:number;densityWeightedCameraDepth84Pc:number; + cameraDepthSigmaPc:number;integratedSamples:number;contributingRays:number;sampledRays:number; + metadata:Record; +} +export const EARTH_AXES:Axes={back:[0,0,-1],right:[0,1,0],down:[-1,0,0]}; +const finite=(v:number):number=>{if(!Number.isFinite(v))throw new RangeError('Nonfinite geometry/photometry');return v;}; +const positive=(v:number):number=>{if(!(finite(v)>0))throw new RangeError('Expected positive value');return v;}; +const vector=(v:readonly number[]):Vec=>{if(v.length!==3)throw new RangeError('Expected XYZ');return [finite(v[0]!),finite(v[1]!),finite(v[2]!)];}; +const add=(a:Vec,b:Vec):Vec=>[a[0]+b[0],a[1]+b[1],a[2]+b[2]],sub=(a:Vec,b:Vec):Vec=>[a[0]-b[0],a[1]-b[1],a[2]-b[2]]; +const scale=(a:Vec,k:number):Vec=>[a[0]*k,a[1]*k,a[2]*k],dot=(a:Vec,b:Vec)=>a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; +const cross=(a:Vec,b:Vec):Vec=>[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]; +const unit=(v:Vec):Vec=>scale(v,1/positive(Math.hypot(...v))); +const smooth=(v:number)=>{const t=Math.max(0,Math.min(1,v));return t*t*(3-2*t);}; +function validateAxes(a:Axes):void{for(const v of [a.back,a.right,a.down])if(Math.abs(Math.hypot(...vector(v))-1)>1e-8)throw new RangeError('Camera/frame axes must be unit vectors');if(Math.abs(dot(a.back,a.right))>1e-8||Math.abs(dot(a.back,a.down))>1e-8||Math.abs(dot(a.right,a.down))>1e-8||dot(cross(a.right,a.back),a.down)<1-1e-8)throw new RangeError('Camera/frame basis must be orthonormal and right-handed');} +function validateBounds(b:PatchBounds):void{if(![b.u0,b.v0,b.u1,b.v1].every(Number.isFinite)||b.u0<0||b.v0<0||b.u1>1||b.v1>1||b.u0>=b.u1||b.v0>=b.v1)throw new RangeError('Patch bounds must be nonempty normalized source coordinates');} +function validateCell(c:Cell):void{vector(c.center);vector(c.half).forEach(positive);if((c.kind!=='core'&&c.kind!=='surround')||![0,1].includes(c.x)||![0,1].includes(c.y)||!Number.isSafeInteger(c.z)||c.z<0||c.z>(c.kind==='core'?2:0))throw new RangeError('Invalid Pleiades cell');} +export function cloudCells():Cell[]{const cells:Cell[]=[];for(let z=0;z<3;z++)for(let y=0;y<2;y++)for(let x=0;x<2;x++)cells.push({id:`core-${x}-${y}-${z}`,kind:'core',x,y,z,center:[x?1.5:-1.5,y?1.5:-1.5,[-3,0,3][z]!],half:[2,2,[2.3,1.3,2.3][z]!]});for(let y=0;y<2;y++)for(let x=0;x<2;x++)cells.push({id:`surround-${x}-${y}`,kind:'surround',x,y,z:0,center:[x?6:-6,y?6:-6,-2],half:[7.2,7.2,14]});return cells;} +/** Exact Pleiades contribution partition; ray integration additionally clips to the cell box. */ +export function cellPart(cell:Cell,x:number,y:number,z:number):number{const sx=smooth((x+.3)/.6),sy=smooth((y+.3)/.6),cw=smooth((3.5-Math.abs(x))/.75)*smooth((3.5-Math.abs(y))/.75)*smooth((z+5.3)/.6)*smooth((5.3-z)/.6),wx=cell.x?sx:1-sx,wy=cell.y?sy:1-sy;if(cell.kind==='surround')return(1-cw)*wx*wy;const first=1-smooth((z+1.3)/.6),last=smooth((z-.7)/.6),wz=cell.z===0?first:cell.z===2?last:1-first-last;return cw*wx*wy*Math.max(0,wz);} +export function cellBox(cell:Cell):Box{return {min:sub(cell.center,cell.half),max:add(cell.center,cell.half)};} +export function patchPlan(coreDivisions=3,surroundDivisions=2):{id:string;cell:Cell;bounds:PatchBounds}[]{for(const d of [coreDivisions,surroundDivisions])if(!Number.isSafeInteger(d)||d<1)throw new RangeError('Patch division count must be a positive integer');return cloudCells().flatMap(cell=>{const n=cell.kind==='core'?coreDivisions:surroundDivisions,out:{id:string;cell:Cell;bounds:PatchBounds}[]=[];for(let y=0;ymin))throw new RangeError('Empty box');const d=finite(ray.direction[a]!),eye=finite(ray.eye[a]!);if(Math.abs(d)<1e-15){if(eyemax)return null;}else{const u=(min-eye)/d,v=(max-eye)/d;low=Math.max(low,Math.min(u,v));high=Math.min(high,Math.max(u,v));}}return high>low?[low,high]:null;} +/** camera is the ACTUAL reference camera basis, supplied by the caller. frameAxes is + * the baked Pleiades Earth frame. cameraEye may differ from the stored Pleiades bake station. */ +export function referenceProjection(cell:Cell,bakeEye:Vec,camera:Axes=EARTH_AXES,options:{frameAxes?:Axes;cameraEye?:Vec;spanPc?:number}={}):ReferenceProjection{ + validateCell(cell);validateAxes(camera);const frame=options.frameAxes??EARTH_AXES;validateAxes(frame);bakeEye=vector(bakeEye);const eye=vector(options.cameraEye??bakeEye),back=unit(sub(bakeEye,cell.center)),right=transported(frame.right,frame.back,back,frame.right),down=transported(frame.down,frame.back,back,frame.right),distance=Math.hypot(...sub(bakeEye,cell.center));let span=0,inside=false; + for(let k=0;k<8;k++){const delta:Vec=[cell.center[0]+(k&1?1:-1)*cell.half[0]-bakeEye[0],cell.center[1]+(k&2?1:-1)*cell.half[1]-bakeEye[1],cell.center[2]+(k&4?1:-1)*cell.half[2]-bakeEye[2]],depth=-dot(delta,back);if(depth<=1e-5){inside=true;break;}span=Math.max(span,2*Math.abs(dot(delta,right))*distance/depth,2*Math.abs(dot(delta,down))*distance/depth);} + if(inside)span=2*distance*Math.tan(80*Math.PI/180);span*=1.02;if(options.spanPc!==undefined)span=positive(options.spanPc);positive(span); + const displayBack=unit(sub(eye,cell.center)),displayRight=transported(frame.right,frame.back,displayBack,frame.right),displayDown=transported(frame.down,frame.back,displayBack,frame.right),basisM=[dot(displayRight,camera.right),dot(displayRight,camera.down),dot(displayDown,camera.right),dot(displayDown,camera.down)] as const,centerDelta=sub(cell.center,eye),cellCameraDepthPc=positive(-dot(centerDelta,camera.back)),cx=dot(centerDelta,camera.right),cy=dot(centerDelta,camera.down); + const displayPlaneXY=(u:number,v:number):readonly[number,number]=>[cx+span*((finite(u)-.5)*basisM[0]+(finite(v)-.5)*basisM[2]),cy+span*((u-.5)*basisM[1]+(v-.5)*basisM[3])]; + return {cell,bakeEye,eye,spanPc:span,insideCellConeApproximation:inside,bakedBack:back,bakedRight:right,bakedDown:down,cameraBack:[...camera.back],cameraRight:[...camera.right],cameraDown:[...camera.down],basisM,cellCameraDepthPc,displayPlaneXY,bakeRay:(u,v)=>({eye:bakeEye,direction:unit(sub(add(add(cell.center,scale(right,(finite(u)-.5)*span)),scale(down,(finite(v)-.5)*span)),bakeEye))}),displayRay:(u,v)=>{const[x,y]=displayPlaneXY(u,v);return {eye,direction:unit(add(add(scale(camera.right,x),scale(camera.down,y)),scale(camera.back,-cellCameraDepthPc)))};}}; +} +interface DepthSample {depth:number;weight:number} +function weightedQuantile(samples:readonly DepthSample[],fraction:number,total:number):number{const sorted=[...samples].sort((a,b)=>a.depth-b.depth);let sum=0;for(const s of sorted){sum+=s.weight;if(sum>=fraction*total)return s.depth;}return sorted.at(-1)!.depth;} +/** Generic integrator also usable by the far-slab owner, with an explicit density + * function and optional original sampling rays. Empty sampled support has no fallback. */ +export function derivePatchFromDensity(density:(x:number,y:number,z:number)=>number,box:Box,projection:ReferenceProjection,bounds:PatchBounds,options:{raysPerAxis?:number;maxStepPc?:number;samplingRay?:(u:number,v:number)=>Ray;centerMode?:'bounds'|'weighted';weightAtUv?:(u:number,v:number)=>number}={}):FixedPatch|null{ + validateBounds(bounds);const n=options.raysPerAxis??5,step=positive(options.maxStepPc??.04);if(!Number.isSafeInteger(n)||n<1||n>31)throw new RangeError('Invalid stratified ray count');const samples:DepthSample[]=[];let total=0,depthSum=0,depth2Sum=0,weightedU=0,weightedV=0,pointSum:Vec=[0,0,0],integratedSamples=0,contributingRays=0; + for(let y=0;y1e-8)throw new RangeError('Sampling ray must have a unit direction');const segment=rayBox(ray,box);if(!segment)continue;const count=Math.ceil((segment[1]-segment[0])/step),ds=(segment[1]-segment[0])/count;let rayWeight=0; + for(let k=0;k=0))throw new RangeError('Negative spatial partition');const weight=rho*ds*window/(n*n),depth=-dot(sub(p,projection.eye),projection.cameraBack);if(!(depth>0))throw new RangeError('Positive density lies behind the reference camera; use a separate far-volume placement');total+=weight;rayWeight+=weight;weightedU+=weight*u;weightedV+=weight*v;depthSum+=weight*depth;depth2Sum+=weight*depth*depth;pointSum=add(pointSum,scale(p,weight));samples.push({depth,weight});} + if(rayWeight>0)contributingRays++; + } + if(total===0)return null; + const depth=depthSum/total,uc=options.centerMode==='weighted'?weightedU/total:(bounds.u0+bounds.u1)/2,vc=options.centerMode==='weighted'?weightedV/total:(bounds.v0+bounds.v1)/2,[cx,cy]=projection.displayPlaneXY(uc,vc),depthScale=depth/projection.cellCameraDepthPc; + const pointOnPlane=(x:number,y:number):Vec=>add(projection.eye,add(add(scale(projection.cameraRight,x),scale(projection.cameraDown,y)),scale(projection.cameraBack,-depth))); + const position=pointOnPlane(cx*depthScale,cy*depthScale),sourceCorners=[[bounds.u0,bounds.v0],[bounds.u1,bounds.v0],[bounds.u1,bounds.v1],[bounds.u0,bounds.v1]] as const,cornersXY=sourceCorners.map(([u,v])=>{const[x,y]=projection.displayPlaneXY(u,v);return [(x-cx)*depthScale,(y-cy)*depthScale] as const;}),diameter=2*Math.max(...cornersXY.flatMap(p=>[Math.abs(p[0]),Math.abs(p[1])]));positive(diameter); + const axis=unit(sub(projection.eye,position)),centerRay=projection.displayRay(uc,vc);if(dot(unit(sub(position,projection.eye)),centerRay.direction)<1-1e-12)throw new Error('Fixed patch moved off its original displayed center ray'); + return {position,diameterPc:diameter,axisTowardReference:axis,bounds:{...bounds},sourceCenterUv:[uc,vc],quadUv:cornersXY.map(([x,y])=>[.5+x/diameter,.5+y/diameter] as const),cameraPlaneCorners:cornersXY.map(([x,y])=>pointOnPlane(cx*depthScale+x,cy*depthScale+y)),cameraDepthPc:depth,densityMeanPhysicalPosition:scale(pointSum,1/total),densityAtRepresentativePoint:finite(density(...position)),densityColumnIntegral:total,densityWeightedCameraDepth16Pc:weightedQuantile(samples,.16,total),densityWeightedCameraDepth84Pc:weightedQuantile(samples,.84,total),cameraDepthSigmaPc:Math.sqrt(Math.max(0,depth2Sum/total-depth*depth)),integratedSamples,contributingRays,sampledRays:n*n,metadata:{centerMode:options.centerMode??'bounds',method:'Caller optical-weight first moment of the original Pleiades sampling rays; representative center placed on its original affine displayed Earth ray',raysPerAxis:n,maxStepPc:step,densityModified:false,depthScatterAdded:false,sourceDensityDependency:'caller density only; no image pixels',sourceProjection:'Original Pleiades cell basis/span and affine CSS matrix; static prewarp must preserve full RGBA',referenceSize:'diameter/cameraDepth and all four corner screen coordinates preserved after prewarp',limitations:['The representative point is a finite-volume billboard centroid, not a measured dust particle or resolved physical thickness.','Column weighting uses equal original texture-area strata, not a recovered physical-volume mass centroid.','A centroid can lie in a cavity or between density peaks; it is not moved by eye to fill a void.','Different cell centroids can interleave the old source-over order; inspect the complete reference composite.','Rotation gives fixed-position parallax, but a camera-facing patch remains a finite-volume approximation.','Sampled empty support returnsnull; the caller must not silently discard a visibly nonempty source patch.']}}; +} diff --git a/packages/bake/authoring/m45/dust/geometry/reference.mts b/packages/bake/authoring/m45/dust/geometry/reference.mts new file mode 100644 index 00000000000..983a59513e4 --- /dev/null +++ b/packages/bake/authoring/m45/dust/geometry/reference.mts @@ -0,0 +1,10 @@ +import {requireRecord} from '@cssearth/core'; +import {parseDensityVolumeFrame} from '@cssearth/objects'; +import {json,vector} from '../field/grid.mts'; +import type {Axes} from './patches.mts'; +/** Fixed preparation camera; the runtime camera never moves this reference. */ +export async function referenceCamera(){ + const parameters=await json('src/objects/milky-way-pleiades-dust/source/parameters.json'),r=requireRecord(parameters.reference),a=requireRecord(r.axes); + const axes:Axes={right:vector(a.right),down:vector(a.down),back:vector(a.back)}; + return {frame:parseDensityVolumeFrame(r.frame),eye:vector(r.eye),axes}; +} diff --git a/packages/bake/authoring/m45/dust/geometry/windows.mts b/packages/bake/authoring/m45/dust/geometry/windows.mts new file mode 100644 index 00000000000..c8b56c95c99 --- /dev/null +++ b/packages/bake/authoring/m45/dust/geometry/windows.mts @@ -0,0 +1,15 @@ +/** C1 partition of a source image across overlapping compact cloud patches. */ +export function patchAxisWeight(t:number,index:number,count:number):number { + const phi=(i:number)=>{const d=count*t-(i+.5);return Math.abs(d)<1?Math.cos(Math.PI*d/2)**2:0;};let total=0;for(let i=0;i0?phi(index)/total:0; +} +/** Split prepared opacity through optical depth, so source-over reconstructs the original endpoint. */ +export function partitionAlpha(alpha:number,weight:number):number {return weight<=0?0:alpha>=1?1:-Math.expm1(weight*Math.log1p(-alpha));} +/** Quantize an entire overlapping partition jointly. Flooring the other pieces + * lets the strongest piece carry the residual transmission with ≤half a byte + * error, instead of losing faint dust independently in every piece. */ +export function quantizedPatchAlpha(alpha:number,u:number,v:number,x:number,y:number,count:number):number { + const weights:number[]=[];let anchor=0;for(let j=0;jweights[anchor]!)anchor=weights.length-1;} + const index=y*count+x;if(weights[index]!<=0||alpha<=0)return 0;if(alpha>=1)return index===anchor?255:0; + let transmitted=1;const bytes=weights.map((w,i)=>{if(i===anchor)return 0;const b=Math.floor(255*partitionAlpha(alpha,w)+1e-12);transmitted*=1-b/255;return b;}); + bytes[anchor]=Math.round(255*Math.max(0,Math.min(1,1-(1-alpha)/transmitted)));return bytes[index]!; +} diff --git a/packages/bake/authoring/m45/dust/geometry/windows.test.mts b/packages/bake/authoring/m45/dust/geometry/windows.test.mts new file mode 100644 index 00000000000..3f07aee3e4f --- /dev/null +++ b/packages/bake/authoring/m45/dust/geometry/windows.test.mts @@ -0,0 +1,14 @@ +import {test} from 'node:test';import assert from 'node:assert/strict';import {patchAxisWeight,partitionAlpha,quantizedPatchAlpha} from './windows.mts'; +import {cloudCells,cellBox,referenceProjection,derivePatchFromDensity} from './patches.mts'; +test('overlapping smooth windows conserve endpoint transmission across the full image',()=>{ + for(const n of [2,3])for(let i=0;i<=400;i++){const weights=Array.from({length:n},(_,k)=>patchAxisWeight(i/400,k,n));assert.ok(Math.abs(weights.reduce((a,b)=>a+b,0)-1)<1e-12);for(const a of [0,.01,.4,.99,1]){const transmitted=weights.reduce((v,w)=>v*(1-partitionAlpha(a,w)),1);assert.ok(Math.abs(transmitted-(1-a))<1e-12);}} + assert.equal(partitionAlpha(1,0),0);const h=1e-6;assert.ok(patchAxisWeight(1/6+h,1,3)/h<1e-4,'support enters with zero slope rather than a crop edge'); +}); +test('emitting-material centers follow the supplied spatial weights and keep their projected ray',()=>{ + const cell=cloudCells()[4]!,projection=referenceProjection(cell,[0,0,-18]),bounds={u0:1/3,v0:1/3,u1:2/3,v1:2/3},weighted=derivePatchFromDensity(()=>1,cellBox(cell),projection,bounds,{centerMode:'weighted',weightAtUv:u=>u>.5?1:0});assert.ok(weighted);assert.ok(weighted.sourceCenterUv[0]>.5);assert.equal(derivePatchFromDensity(()=>1,cellBox(cell),projection,bounds,{centerMode:'weighted',weightAtUv:()=>0}),null); + const ray=projection.displayRay(...weighted.sourceCenterUv),delta=weighted.position.map((v,i)=>v-ray.eye[i]!);const norm=Math.hypot(...delta);assert.ok(delta.reduce((sum,v,i)=>sum+v/norm*ray.direction[i]!,0)>1-1e-12); +}); + +test('joint 8bit allocation preserves faint and opaque endpoint opacity',()=>{ + for(const n of [2,3])for(let k=0;k<=40;k++)for(const a of [0,1/255,5/255,.4,.99,1]){const u=k/40,v=(40-k)/40;let transmitted=1;for(let y=0;y=0&&b<=255);transmitted*=1-b/255;if(patchAxisWeight(u,x,n)*patchAxisWeight(v,y,n)===0)assert.equal(b,0);}assert.ok(Math.abs(1-transmitted-a)<=.5/255+1e-12);} +}); diff --git a/packages/bake/authoring/m45/dust/install-transaction.mts b/packages/bake/authoring/m45/dust/install-transaction.mts new file mode 100644 index 00000000000..c01223ee6ef --- /dev/null +++ b/packages/bake/authoring/m45/dust/install-transaction.mts @@ -0,0 +1,13 @@ +import {readFile,rename,rm,writeFile} from 'node:fs/promises'; +/** Install a fully staged bank and its records, restoring the prior state on a failed write. */ +export async function installPreparedBank(paths:{live:string;stage:string;backup:string;object:string;stagedObject:string;inventory:string;stagedInventory:string}){ + const oldObject=await readFile(paths.object),oldInventory=await readFile(paths.inventory);let moved=false,installed=false; + await rm(paths.backup,{recursive:true,force:true}); + try{ + await rename(paths.live,paths.backup);moved=true;await rename(paths.stage,paths.live);installed=true; + await rename(paths.stagedObject,paths.object);await rename(paths.stagedInventory,paths.inventory); + }catch(error){ + if(installed)await rm(paths.live,{recursive:true,force:true});if(moved)await rename(paths.backup,paths.live); + await writeFile(paths.object,oldObject);await writeFile(paths.inventory,oldInventory);throw error; + } +} diff --git a/packages/bake/authoring/m45/dust/install-transaction.test.mts b/packages/bake/authoring/m45/dust/install-transaction.test.mts new file mode 100644 index 00000000000..8c5c8108274 --- /dev/null +++ b/packages/bake/authoring/m45/dust/install-transaction.test.mts @@ -0,0 +1,9 @@ +import assert from 'node:assert/strict';import test from 'node:test';import {mkdtemp,mkdir,writeFile,readFile,rm} from 'node:fs/promises';import {join} from 'node:path';import {tmpdir} from 'node:os'; +import {installPreparedBank} from './install-transaction.mts'; +test('a missing staged record after the data swap restores the prior bank and both records',async()=>{ + const root=await mkdtemp(join(tmpdir(),'pleiades-install-'));try{ + const paths={live:join(root,'prepared'),stage:join(root,'staged'),backup:join(root,'backup'),object:join(root,'object.json'),stagedObject:join(root,'missing.json'),inventory:join(root,'inventory.json'),stagedInventory:join(root,'new-inventory.json')}; + await mkdir(paths.live);await mkdir(paths.stage);await writeFile(join(paths.live,'bank'),'previous');await writeFile(join(paths.stage,'bank'),'current');await writeFile(paths.object,'previous-object');await writeFile(paths.inventory,'previous-inventory');await writeFile(paths.stagedInventory,'current-inventory'); + await assert.rejects(installPreparedBank(paths),{code:'ENOENT'});assert.equal(await readFile(join(paths.live,'bank'),'utf8'),'previous');assert.equal(await readFile(paths.object,'utf8'),'previous-object');assert.equal(await readFile(paths.inventory,'utf8'),'previous-inventory'); + }finally{await rm(root,{recursive:true,force:true});} +}); diff --git a/packages/bake/authoring/m45/dust/install.mts b/packages/bake/authoring/m45/dust/install.mts new file mode 100644 index 00000000000..9b414e00c54 --- /dev/null +++ b/packages/bake/authoring/m45/dust/install.mts @@ -0,0 +1,30 @@ +import {copyFile,mkdir,readFile,writeFile,rm,rename} from 'node:fs/promises'; +import {resolve} from 'node:path'; +import {requireArray,requireRecord} from '@cssearth/core'; +import {readCloudPoints,validatePreparedVolumeDatasets} from '@cssearth/objects'; +import {inventoryPreparedAssets,readVolumeDatasetBank,writeVolumeDatasetBank,unpackPreparedBank} from '@cssearth/objects/node'; +import {installPreparedBank} from './install-transaction.mts'; +import {json} from './field/grid.mts'; +const pilot=process.argv.includes('--pilot'),out=`.local/pleiades-dust/${pilot?'pilot':'bake'}`,id='milky-way-pleiades-dust'; +const directory=resolve('src/objects',id),live=resolve(directory,'prepared'),stage=resolve(directory,'prepared-current-stage'); +const record=await json(`${out}/record.json`),cloud=readCloudPoints(unpackPreparedBank(await readFile(`${out}/foreground-cloud.bin`))); +if(record.executionComplete!==true||record.pilot!==pilot||cloud.count!==record.count||cloud.occluder.length)throw Error('Completed fixed-image cloud required'); +const part=await json(`${out}/wide-part.json`),old=await readVolumeDatasetBank(live),label='Pleiades dust model'; +const description='Infrared-constrained foreground dust lit by cluster stars, with faint Galactic cirrus. Cloud depth is inferred.'; +if(old.datasets.length!==1||old.defaultDataset!=='smooth-dust')throw Error('Exactly one current dust dataset required'); +const bank=validatePreparedVolumeDatasets({...old,datasets:old.datasets.map(dataset=>({...dataset,label,title:label,description,volume:{...dataset.volume,resources:requireArray(part.resources),stacks:dataset.volume.stacks.map(stack=>({...stack,leaves:stack.axis==='z'?requireArray(part.quads):[]})),provenance:{generator:'packages/bake/authoring/m45/dust/install.mts'},approximation:{method:'Fixed foreground cloud elements and fixed Galactic cirrus panorama; depth and Earth-reference illumination are modeled'}}}))}); +await rm(stage,{recursive:true,force:true});await mkdir(stage,{recursive:true}); +for(const file of ['foreground-cloud.bin','foreground-cloud-atlas.webp','point-transmission.bin'])await copyFile(resolve(out,file),resolve(stage,file)); +await copyFile(resolve(live,'stars.bin'),resolve(stage,'stars.bin')); +for(const resource of bank.datasets[0]!.volume.resources){await mkdir(resolve(stage,resource.path,'..'),{recursive:true});await copyFile(resolve(out,resource.path),resolve(stage,resource.path));} +await writeVolumeDatasetBank(stage,bank); +const presentation=await json(resolve(live,'presentation.json'));if(requireArray(presentation.controls).length!==1)throw Error('Exactly one presentation control required');presentation.controls=requireArray(presentation.controls).map(value=>({...requireRecord(value),label,title:label,summary:description,description,thumbnailUrl:`/scenes/${id}/dust-preview.png`,texture:{url:`/scenes/${id}/dust-preview.png`,width:256,height:256}})); +await writeFile(resolve(stage,'presentation.json'),JSON.stringify(presentation,null,2)+'\n'); +if(pilot){const destination=resolve('.local/pleiades-dust/install-pilot');await rm(destination,{recursive:true,force:true});await rename(stage,destination);}else{ + const object=await json(resolve(directory,'object.json'));const properties=requireRecord(object.properties);properties.preparation={source:'source/model.json'};properties.overlays={'smooth-dust':['foreground-cloud']}; + const records=resolve('.local/pleiades-dust/install-records');await mkdir(records,{recursive:true}); + await writeFile(resolve(records,'object.json'),JSON.stringify(object,null,2)+'\n');await copyFile(resolve(directory,'inventory.json'),resolve(records,'inventory.json')); + await inventoryPreparedAssets({objectId:id,objectDirectory:records,preparedRoot:stage,filenames:['datasets.json','presentation.json','stars.bin','smooth-dust/volume.json','point-transmission.bin','foreground-cloud.bin','foreground-cloud-atlas.webp',...bank.datasets[0]!.volume.resources.map(r=>r.path)]}); + await installPreparedBank({live,stage,backup:resolve('.local/pleiades-dust/prepared-before-install'),object:resolve(directory,'object.json'),inventory:resolve(directory,'inventory.json'),stagedObject:resolve(records,'object.json'),stagedInventory:resolve(records,'inventory.json')}); +} +console.log('PLEIADES_DUST_INSTALLED',JSON.stringify({pilot,count:cloud.count,faces:bank.datasets[0]!.volume.resources.length})); diff --git a/packages/bake/authoring/m45/dust/panorama/geometry.mts b/packages/bake/authoring/m45/dust/panorama/geometry.mts new file mode 100644 index 00000000000..d3309cc18d8 --- /dev/null +++ b/packages/bake/authoring/m45/dust/panorama/geometry.mts @@ -0,0 +1,45 @@ +import assert from 'node:assert/strict'; +import { compileLeafBounds } from '@cssearth/bake/volume-leaves'; +import type { PreparedVolumeLeaf } from '@cssearth/objects'; + +const cssPair = (value: string) => value.split(' ').map(Number.parseFloat); +const matrixOf = (leaf: PreparedVolumeLeaf) => { + const matrix = leaf.style.transform.slice(9, -1).split(',').map(Number); + if (matrix.length !== 16 || !matrix.every(Number.isFinite) || matrix[3] || matrix[7] || matrix[11] || matrix[15] !== 1) throw new Error('Existing affine prepared cube face required'); + return matrix; +}; + +/** Compare the painted source pixels, including the existing compiler's .6-unit + * bleed. Recompiling an enlarged cube would subtly stretch the old picture. */ +export function assertNativeRays(before: PreparedVolumeLeaf, after: PreparedVolumeLeaf, gutter: number): number { + const old = matrixOf(before), next = matrixOf(after), a = cssPair(before.style.backgroundSize), b = cssPair(after.style.backgroundSize); + const pa = cssPair(before.style.backgroundPosition), pb = cssPair(after.style.backgroundPosition); + let maximum = 0; + for (const [u, v] of [[0, 0], [1, 0], [1, 1], [0, 1], [.5, .5]]) { + const ax = pa[0]! + u! * a[0]!, ay = pa[1]! + v! * a[1]!; + const bx = pb[0]! + (gutter + u! * before.widthPx) / after.widthPx * b[0]!; + const by = pb[1]! + (gutter + v! * before.heightPx) / after.heightPx * b[1]!; + for (let row = 0; row < 3; row++) { + const error = Math.abs(old[row]! * ax + old[row + 4]! * ay + old[row + 12]! - (next[row]! * bx + next[row + 4]! * by + next[row + 12]!)); + maximum = Math.max(maximum, error); assert(error < 1e-6, 'Native picture ray moved when extending prepared support'); + } + } + return maximum; +} + +/** Extend the existing compiled face; its matrix basis and original painted + * pixel locations stay fixed. Only new transparent/feathered support is added. */ +export function extendPreparedFace(before: PreparedVolumeLeaf, texturePath: string, gutter: number) { + if (before.widthPx !== before.heightPx || !Number.isInteger(gutter) || gutter < 2) throw new Error('Square prepared face and native gutter required'); + const matrix = matrixOf(before), span = cssPair(before.style.backgroundSize), n = before.widthPx, texels = n + 2 * gutter; + const width = Number.parseFloat(before.style.width), height = Number.parseFloat(before.style.height); + if (![...span, width, height].every(value => value > 0 && Number.isFinite(value))) throw new Error('Finite image box required'); + const px = gutter * span[0]! / n, py = gutter * span[1]! / n; + for (let row = 0; row < 3; row++) matrix[row + 12]! -= px * matrix[row]! + py * matrix[row + 4]!; + const joined = matrix.join(','), nextWidth = width + 2 * px, nextHeight = height + 2 * py; + const after: PreparedVolumeLeaf = { ...before, id: before.id.replace(/^Pleiades-/u, 'Pleiades-'), texturePath, widthPx: texels, heightPx: texels, + boundsCssPixels: compileLeafBounds(joined, nextWidth, nextHeight), style: { ...before.style, + width: `${nextWidth}px`, height: `${nextHeight}px`, transform: `matrix3d(${joined})`, + backgroundSize: `${span[0]! * texels / n}px ${span[1]! * texels / n}px` } }; + return { leaf: after, maximumNativeRayErrorCssWorld: assertNativeRays(before, after, gutter) }; +} diff --git a/packages/bake/authoring/m45/dust/panorama/guard.mts b/packages/bake/authoring/m45/dust/panorama/guard.mts new file mode 100644 index 00000000000..c1c5883ee15 --- /dev/null +++ b/packages/bake/authoring/m45/dust/panorama/guard.mts @@ -0,0 +1,33 @@ +import assert from 'node:assert/strict'; +import {mkdir,writeFile} from 'node:fs/promises'; +import sharp from 'sharp'; +import {SKY_BASES,skyRay} from '@cssearth/bake/sky'; +import type {PreparedVolumeLeaf} from '@cssearth/objects'; +import {dilateTransparentRgb} from '../atlas/pack.mts'; +import {faceWeights,guardedPixel,type FacePixels} from './seams.mts'; +import {extendPreparedFace} from './geometry.mts'; +import type {FixedWideResult} from './integrate.mts'; +/** Extend the six freshly integrated faces without moving any original painted ray. */ +export async function guardPanorama(out:string,native:FixedWideResult):Promise{ + const size=256,gutter=4,texels=size+2*gutter;await mkdir(`${out}/cirrus`,{recursive:true}); + const faces:FacePixels[]=[]; + for(const basis of SKY_BASES){const raw=await sharp(`${out}/cirrus-native/${basis.id}.webp`).ensureAlpha().raw().toBuffer({resolveWithObject:true}); + assert.equal(raw.info.width,size);assert.equal(raw.info.height,size);assert.equal(raw.info.channels,4);faces.push({basis,size,rgba:new Uint8Array(raw.data)});} + const quads:PreparedVolumeLeaf[]=[],resources:FixedWideResult['resources'][number][]=[],details=[]; + for(const [index,basis]of SKY_BASES.entries()){ + const rgba=new Uint8Array(texels*texels*4); + for(let y=0;y=gutter&&x=gutter&&yleaf.texturePath===`cirrus-native/${basis.id}.webp`);if(!before)throw Error('Missing integrated face'); + const result=extendPreparedFace(before,path,gutter);quads.push({...result.leaf,id:`cirrus-${basis.id}`});resources.push({path,width:texels,height:texels,bytes:bytes.length});details.push({face:basis.id,maximumNativeRayErrorCssWorld:result.maximumNativeRayErrorCssWorld}); + } + const partPath=`${out}/wide-part.json`,recordPath=`${out}/wide-record.json`,metadata={...native.metadata,gutter,texels,details}; + await writeFile(partPath,JSON.stringify({quads,resources},null,2)+'\n');await writeFile(recordPath,JSON.stringify(metadata,null,2)+'\n'); + console.log('PLEIADES_CIRRUS_READY');return{count:6,texels,metadata,partPath,recordPath,quads,resources}; +} diff --git a/packages/bake/authoring/m45/dust/panorama/integrate.mts b/packages/bake/authoring/m45/dust/panorama/integrate.mts new file mode 100644 index 00000000000..98a8b5ed2b6 --- /dev/null +++ b/packages/bake/authoring/m45/dust/panorama/integrate.mts @@ -0,0 +1,138 @@ +import { mkdir, readFile, writeFile } from 'node:fs/promises'; +import { dirname, join, resolve } from 'node:path'; +import sharp from 'sharp'; +import { requireArray, requireFiniteNumber, requireRecord } from '@cssearth/core'; +import type { PreparedCssVolume, PreparedVolumeLeaf, Vector3 } from '@cssearth/objects'; +import { compileCssSky, SKY_BASES, skyRay, type BakedSky, type BakedSkyFace } from '@cssearth/bake/sky'; +import type { Field } from '../field/density.mts'; +import type { Transport } from '../physics/illumination.mts'; +import type { Vec } from '../physics/types.mts'; +import { foregroundSelection } from '../field/foreground.mts'; + +interface WideOptions { field: Field; transport: Transport; frame: PreparedCssVolume['frame']; out: string; pilot: boolean } +export interface FixedWideResult { + count: number; texels: number; metadata: Record; partPath: string; recordPath: string; + quads: PreparedVolumeLeaf[]; resources: PreparedCssVolume['resources']; +} +interface RasterFace { basis: typeof SKY_BASES[number]; path: string; bytes: number; nonzero: number; peakAlpha: number; maximumRadiance: number } +const TEXELS = 256, DISPLAY_RADIUS_PC = 100000, MAX_STEP_PC = 1, NEAR_STEP_PC = .125; +const OBSERVER: Vec = [0, 0, -1.1585], MODE = 'fixed-panorama'; +const save = (path: string, value: unknown) => writeFile(path, JSON.stringify(value, null, 2) + '\n'); +const srgb = (v: number) => v <= .0031308 ? 12.92 * v : 1.055 * v ** (1 / 2.4) - .055; + +function interval(origin: Vec, direction: Vec, min: Vec, max: Vec): [number, number] | null { + let low = 0, high = Infinity; + for (let a = 0; a < 3; a++) { + if (Math.abs(direction[a]!) < 1e-14) { if (origin[a]! < min[a]! || origin[a]! > max[a]!) return null; continue; } + const x = (min[a]! - origin[a]!) / direction[a]!, y = (max[a]! - origin[a]!) / direction[a]!; + low = Math.max(low, Math.min(x, y)); high = Math.min(high, Math.max(x, y)); + } + return high > low && Number.isFinite(high) ? [low, high] : null; +} +function faceGeometry(basis: typeof SKY_BASES[number], image: RasterFace): BakedSkyFace { + const corners = [[-1, 1], [1, 1], [1, -1], [-1, -1]] as const; + // The compiler uses these numeric vertices without rotating them. They are LOCAL bank coordinates; + // the volume runtime transports the bank's quaternion once, unlike the global ICRF sky runtime. + const vertices: Vector3[] = corners.map(([u, v]) => [0, 1, 2].map(a => + OBSERVER[a]! + DISPLAY_RADIUS_PC * (basis.forwardIcrf[a]! + u * basis.rightIcrf[a]! + v * basis.upIcrf[a]!)) as Vector3); + return { ...basis, texturePath: image.path, widthPx: TEXELS, heightPx: TEXELS, bytes: image.bytes, + vertices, uvs: [[0, 0], [1, 0], [1, 1], [0, 1]] }; +} + +/** Six immutable transparent cube faces; display depth is an explicit far-panorama approximation. */ +export async function prepareWide({ field, transport, frame, out, pilot }: WideOptions): Promise { + const started = Date.now(), destination = resolve(out); + if (!destination.startsWith(resolve('.local/pleiades-dust') + '/')) throw new Error('Pleiades wide output must remain local'); + await mkdir(join(destination, 'cirrus-native'), { recursive: true }); + if (!pilot) { + const prior = requireRecord(JSON.parse(await readFile(join(dirname(destination), 'pilot', 'wide-native-record.json'), 'utf8'))); + if (prior.executionComplete !== true || prior.pilot !== true || prior.mode !== MODE || prior.texels !== TEXELS || + prior.displayRadiusPc !== DISPLAY_RADIUS_PC || prior.maximumStepPc !== MAX_STEP_PC || prior.nearStepPc !== NEAR_STEP_PC || + JSON.stringify(prior.panoramaObserverPc) !== JSON.stringify(OBSERVER)) throw new Error('Matching positive R2 fixed-panorama pilot required'); + } + const old = requireRecord(JSON.parse(await readFile('src/objects/milky-way-pleiades-dust/source/parameters.json', 'utf8'))), display = requireRecord(old.display); + const exposure = requireFiniteNumber(display.exposure), inputGains = requireArray(display.gains).map(value => requireFiniteNumber(value)); + if (inputGains.length !== 3 || !(exposure > 0) || inputGains.some(v => !(v > 0))) throw new Error('Positive inherited display required'); + const gains: Vec = [inputGains[0]!, inputGains[1]!, inputGains[2]!]; + const selection = foregroundSelection(field), galactic = transport.source([0, 0, -1], selection.earthEye, 'galactic'); + const source = new Float64Array(3), total = new Float64Array(3), rasters: RasterFace[] = [], faceRecords: Record[] = []; + const plan = SKY_BASES; + for (const basis of plan) { + const rgba = new Uint8Array(TEXELS * TEXELS * 4), radiance = new Float32Array(TEXELS * TEXELS * 3); + let nonzero = 0, peakAlpha = 0, maximumRadiance = 0, integrationSamples = 0; + for (let y = 0; y < TEXELS; y++) for (let x = 0; x < TEXELS; x++) { + const direction = skyRay(basis, 2 * (x + .5) / TEXELS - 1, 1 - 2 * (y + .5) / TEXELS); + const segment = interval(OBSERVER, direction, field.bounds.min, field.bounds.max); + total.fill(0); + if (segment) { + // Resolve the retained near-background component without moving it into the foreground. + // Outside this same physical fine domain the Edenhofer map has native ~1pc sampling. + const fine = interval(OBSERVER, direction, [-12, -12, -16], [12, 12, 12]); + const cuts = [segment[0], segment[1], ...(fine ? fine.filter(t => t > segment[0] && t < segment[1]) : [])].sort((a, b) => a - b); + for (let k = 1; k < cuts.length; k++) { + const low = cuts[k - 1]!, high = cuts[k]!, middle = (low + high) / 2; + const maxStep = fine && middle >= fine[0] && middle <= fine[1] ? NEAR_STEP_PC : MAX_STEP_PC; + const steps = Math.ceil((high - low) / maxStep), ds = (high - low) / steps; + for (let j = 0; j < steps; j++) { + const distance = low + (j + .5) * ds, at: Vec = [OBSERVER[0] + direction[0] * distance, OBSERVER[1] + direction[1] * distance, OBSERVER[2] + direction[2] * distance]; + const rho = selection.remaining(...at); + if (!(rho >= 0 && Number.isFinite(rho))) throw new Error('Nonphysical remaining dust density'); + integrationSamples++; + if (rho === 0) continue; + galactic.at(...at, source); + for (let c = 0; c < 3; c++) total[c]! += rho * source[c]! * ds; + } + } + } + const pixel = y * TEXELS + x, offset = pixel * 4; + if (total.some(value => !(value >= 0 && Number.isFinite(value)))) throw new Error('Nonphysical Galactic radiance'); + radiance.set(total, pixel * 3); maximumRadiance = Math.max(maximumRadiance, ...total); + const peak = Math.max(...total.map((value, c) => value * gains[c]!)), alpha = -Math.expm1(-exposure * peak); + rgba[offset + 3] = Math.round(255 * alpha); peakAlpha = Math.max(peakAlpha, rgba[offset + 3]!); + if (rgba[offset + 3]) { nonzero++; for (let c = 0; c < 3; c++) rgba[offset + c] = Math.round(255 * srgb(peak ? Math.min(1, total[c]! * gains[c]! / peak) : 0)); } + } + const path = `cirrus-native/${basis.id}.webp`, png = `cirrus-native/${basis.id}.png`, buffer = await sharp(rgba, { raw: { width: TEXELS, height: TEXELS, channels: 4 } }).webp({ lossless: true }).toBuffer(); + await writeFile(join(destination, path), buffer); + await sharp(rgba, { raw: { width: TEXELS, height: TEXELS, channels: 4 } }).png().toFile(join(destination, png)); + await writeFile(join(destination, `cirrus-native/${basis.id}.f32`), Buffer.from(radiance.buffer)); + rasters.push({ basis, path, bytes: buffer.length, nonzero, peakAlpha: peakAlpha / 255, maximumRadiance }); + faceRecords.push({ id: basis.id, path, bytes: buffer.length, nonzero, peakAlpha: peakAlpha / 255, maximumRadiance, integrationSamples, + forwardLocal: basis.forwardIcrf, rightLocal: basis.rightIcrf, upLocal: basis.upIcrf }); + console.log('PLEIADES_FIXED_WIDE_FACE_COMPLETE', JSON.stringify({ id: basis.id, nonzero, bytes: buffer.length, integrationSamples, seconds: (Date.now() - started) / 1000 })); + await new Promise(done => setImmediate(done)); + } + if (!rasters.some(face => face.nonzero)) throw new Error('No Galactic cirrus survived inherited display precision'); + // The existing sky compiler validates six face bases. The pilot reuses its real +z texture solely + // while compiling the other five unused geometries, then emits only the actually integrated face. + const first = rasters[0]!; + const baked: BakedSky = { faces: SKY_BASES.map(basis => faceGeometry(basis, rasters.find(face => face.basis.id === basis.id) ?? first)), + provenance: { generator: 'packages/bake/authoring/m45/dust/panorama/integrate.mts', localGeometry: true }, approximation: { displayRadiusPc: DISPLAY_RADIUS_PC } }; + const compiled = compileCssSky(baked, frame), actualIds = new Set(rasters.map(face => face.basis.id)); + const quads: PreparedVolumeLeaf[] = compiled.sky.faces.filter(face => actualIds.has(face.id)).map(face => ({ + id: `cirrus-native-${face.id}`, centerUnits: [OBSERVER[0] + DISPLAY_RADIUS_PC * face.forwardIcrf[0], OBSERVER[1] + DISPLAY_RADIUS_PC * face.forwardIcrf[1], OBSERVER[2] + DISPLAY_RADIUS_PC * face.forwardIcrf[2]], + texturePath: face.texturePath, widthPx: face.widthPx, heightPx: face.heightPx, + ...(face.boundsCssPixels ? { boundsCssPixels: face.boundsCssPixels } : {}), style: face.style, + })); + const resources: PreparedCssVolume['resources'] = rasters.map(face => ({ path: face.path, width: TEXELS, height: TEXELS, bytes: face.bytes })); + const partPath = join(destination, 'wide-part.json'), recordPath = join(destination, 'wide-native-record.json'); + const metadata = { executionComplete: true, version: 'Pleiades-r2', mode: MODE, pilot, count: quads.length, texels: TEXELS, + displayRadiusPc: DISPLAY_RADIUS_PC, panoramaObserverPc: OBSERVER, maximumStepPc: MAX_STEP_PC, nearStepPc: NEAR_STEP_PC, + physicalIntegrationBoundsPc: field.bounds, earthIlluminationObserverPc: selection.earthEye, selection: selection.metadata, + density: 'foregroundSelection.remaining; no moved material, renormalization, photo painting or density masks; full density remains in attenuation caches', + illumination: 'Same fixed Earth Galactic-only incoming and outgoing attenuation source at every physical sample; no B-star illumination in the panorama', + source: { field: field.metadata, transport: transport.metadata }, display: { exposure, gains, axisAlphaMultiplier: 1, fitted: false }, + binding: { type: 'six rigid transparent cube faces in existing volume fixedImages opt-in', stack: 'z only; x/y empty', fixedImages: true, residentStacks: true, + unitScale: 50, intrinsicOpacity: 1, parentOpacityRequirement: 'Retain constant opacity through ancestors; no axis weighting, optical gains, distance fades or additional cirrus layers', + coordinateFrame: 'LOCAL bank coordinates; the shared volume camera transports localToReferenceXyzw exactly once', geometryCompiler: 'Existing compileCssSky / compileVolumeLeaf, projective cube faces, no hand-authored runtime transforms' }, + nativePixels: rasters.length * TEXELS * TEXELS, faces: faceRecords, seconds: (Date.now() - started) / 1000, + limitations: ['The finite100000pc cube is display geometry, not measured dust distance; all remaining ambient material, including near background, is approximated as far sky.', + 'The panorama is seen from one fixed cluster reference. Translation parallax over18pc is at most about0.0104degrees at a face center; the source geometry does not follow the camera.', + 'Reference Earth incoming/outgoing attenuation is intentionally frozen, including for rays opposite Earth; this is an fixed-reference fixed-light display, not angle-correct radiative transfer.', + 'The Edenhofer regional map is finite; rays stop at its actual box and do not invent dust beyond it.256px faces limit angular structure to roughly0.2–0.45degrees.', + 'Six-direction Galactic-field shielding and first-order scattering inherit the transport approximation.Optical images supply no geometry, radiance or spatial gain.', + 'Image radiance is encoded once with inherited Pleiades exposure/gains and normal source-over alpha; low signal below half an8bit alpha step is unrepresented.'] }; + await save(partPath, { quads, resources }); await save(recordPath, metadata); + for (const path of [partPath, recordPath, ...rasters.map(face => join(destination, face.path))]) if (!(await readFile(path)).length) throw new Error('Missing fixed-panorama output'); + console.log('PLEIADES_FIXED_WIDE_COMPLETE', JSON.stringify({ mode: MODE, pilot, count: quads.length, texels: TEXELS, seconds: metadata.seconds })); + return { count: quads.length, texels: TEXELS, metadata, partPath, recordPath, quads, resources }; +} diff --git a/packages/bake/authoring/m45/dust/panorama/seams.mts b/packages/bake/authoring/m45/dust/panorama/seams.mts new file mode 100644 index 00000000000..ad4dc304231 --- /dev/null +++ b/packages/bake/authoring/m45/dust/panorama/seams.mts @@ -0,0 +1,72 @@ +import { SKY_BASES, type SkyBasis } from '@cssearth/bake/sky'; +import { partitionAlpha } from '../geometry/windows.mts'; + +export type Direction = readonly [number, number, number]; +export interface FacePixels { basis: SkyBasis; size: number; rgba: Uint8Array } +export type Pixel = readonly [number, number, number, number]; +const dot = (a: Direction, b: Direction) => a.reduce((sum, value, i) => sum + value * b[i]!, 0); +const clamp = (value: number, low: number, high: number) => Math.max(low, Math.min(high, value)); + +/** A fixed angular partition of one panorama. A full native texel is transparent + * before each expanded geometric edge, so raster AA cannot clip nonzero light. */ +export function faceWeights(direction: Direction, size: number, gutter: number): Float64Array { + if (!Number.isInteger(size) || size < 4 || !Number.isInteger(gutter) || gutter < 2 || !direction.every(Number.isFinite)) throw new Error('Finite ray and positive guarded cube dimensions required'); + const maximum = Math.max(...direction.map(Math.abs)); + if (!(maximum > 0)) throw new Error('Nonzero panorama ray required'); + const support = 1 + 2 * (gutter - 1) / size, threshold = 1 / support; + const weights = Float64Array.from(SKY_BASES, basis => { + const t = clamp((dot(direction, basis.forwardIcrf) / maximum - threshold) / (1 - threshold), 0, 1); + return t * t * (3 - 2 * t); + }); + const total = weights.reduce((sum, value) => sum + value, 0); + return weights.map(value => value / total); +} + +/** Bilinear source-over display values, clamped to this measured face's last + * sample. The common cross-face interpolation below is identical for all copies. */ +function sampleFace(face: FacePixels, direction: Direction): Pixel { + const depth = dot(direction, face.basis.forwardIcrf), n = face.size; + const x = clamp((dot(direction, face.basis.rightIcrf) / depth + 1) * n / 2 - .5, 0, n - 1); + const y = clamp((1 - dot(direction, face.basis.upIcrf) / depth) * n / 2 - .5, 0, n - 1); + const ix = Math.floor(x), iy = Math.floor(y), u = x - ix, v = y - iy, result = [0, 0, 0, 0]; + for (let j = 0; j < 2; j++) for (let i = 0; i < 2; i++) { + const offset = (Math.min(iy + j, n - 1) * n + Math.min(ix + i, n - 1)) * 4; + const alpha = face.rgba[offset + 3]! / 255, weight = (i ? u : 1 - u) * (j ? v : 1 - v); + result[3]! += alpha * weight; + for (let c = 0; c < 3; c++) result[c]! += face.rgba[offset + c]! / 255 * alpha * weight; + } + return [result[0]!, result[1]!, result[2]!, result[3]!]; +} + +/** One continuous prepared angular image; interpolation changes only the narrow + * face-edge overlap. RGB is the existing display RGB, not a new physical fit. */ +export function samplePanorama(faces: readonly FacePixels[], direction: Direction, weights: Float64Array): Pixel { + const result = [0, 0, 0, 0]; + for (const [i, face] of faces.entries()) if (weights[i]! > 0) { + const pixel = sampleFace(face, direction); + for (let c = 0; c < 4; c++) result[c]! += weights[i]! * pixel[c]!; + } + return [result[3] ? result[0]! / result[3] : 0, result[3] ? result[1]! / result[3] : 0, + result[3] ? result[2]! / result[3] : 0, result[3]!]; +} + +/** Joint8bit optical allocation: the strongest face carries residual + * transmission, bounding source-over alpha error to half one alpha byte. */ +export function opticalBytes(alpha: number, weights: Float64Array): Uint8Array { + if (!(alpha >= 0 && alpha <= 1) || weights.some(weight => !(weight >= 0 && weight <= 1)) || Math.abs(weights.reduce((sum, value) => sum + value, 0) - 1) > 1e-10) throw new Error('Normalized finite optical partition required'); + let anchor = 0; + weights.forEach((weight, i) => { if (weight > weights[anchor]!) anchor = i; }); + const bytes = new Uint8Array(weights.length); + if (alpha === 1) { bytes[anchor] = 255; return bytes; } + let transmitted = 1; + weights.forEach((weight, i) => { if (i !== anchor) { bytes[i] = Math.floor(255 * partitionAlpha(alpha, weight) + 1e-12); transmitted *= 1 - bytes[i]! / 255; } }); + bytes[anchor] = Math.round(255 * clamp(1 - (1 - alpha) / transmitted, 0, 1)); + return bytes; +} + +export function guardedPixel(faces: readonly FacePixels[], faceIndex: number, direction: Direction, gutter: number): Pixel { + const weights = faceWeights(direction, faces[0]!.size, gutter); + if (!weights[faceIndex]) return [0, 0, 0, 0]; + const common = samplePanorama(faces, direction, weights), bytes = opticalBytes(common[3], weights); + return [Math.round(255 * common[0]), Math.round(255 * common[1]), Math.round(255 * common[2]), bytes[faceIndex]!]; +} diff --git a/packages/bake/authoring/m45/dust/panorama/seams.test.mts b/packages/bake/authoring/m45/dust/panorama/seams.test.mts new file mode 100644 index 00000000000..91949ce3e15 --- /dev/null +++ b/packages/bake/authoring/m45/dust/panorama/seams.test.mts @@ -0,0 +1,71 @@ +import assert from 'node:assert/strict'; +import test from 'node:test'; +import { compileCssSky, SKY_BASES, skyRay, type BakedSky } from '@cssearth/bake/sky'; +import { faceWeights, guardedPixel, opticalBytes, samplePanorama, type FacePixels } from './seams.mts'; +import { assertNativeRays, extendPreparedFace } from './geometry.mts'; + +const size = 256, gutter = 4, extent = 1 + 2 * gutter / size; +const fixture = (alpha: number): FacePixels[] => SKY_BASES.map(basis => { + const rgba = new Uint8Array(size * size * 4); + for (let p = 0; p < size * size; p++) rgba.set([197, 213, 241, alpha], p * 4); + return { basis, size, rgba }; +}); + +test('compiled expanded planes preserve native picture rays at the original cube radius', () => { + const frame = { referenceFrame: 'test-icrf', epochJdTt: 123, originM: [0, 0, 0] as const, localToReferenceXyzw: [0, 0, 0, 1] as const, + metersPerUnit: 1, boundsUnits: { min: [-1, -1, -1] as const, max: [1, 1, 1] as const } }; + const baked: BakedSky = { faces: SKY_BASES.map(basis => ({ ...basis, texturePath: `sky/${basis.id}.webp`, widthPx: size, heightPx: size, bytes: 100, + vertices: [[-1, 1], [1, 1], [1, -1], [-1, -1]].map(([u, v]) => [0, 1, 2].map(axis => 100000 * (basis.forwardIcrf[axis]! + u! * basis.rightIcrf[axis]! + v! * basis.upIcrf[axis]!)) as [number, number, number]), + uvs: [[0, 0], [1, 0], [1, 1], [0, 1]] })), provenance: {}, approximation: {} }; + const compiled = compileCssSky(baked, frame); + for (const face of compiled.sky.faces) { + const before = { ...face, id: `cirrus-native-${face.id}`, centerUnits: [0, 0, 0] as const }; + const result = extendPreparedFace(before, `next/${face.id}.webp`, gutter); + assert.equal(result.leaf.widthPx, 264); assert(result.maximumNativeRayErrorCssWorld < 1e-6); + // Keeping the old butted geometry underneath a newly padded image must fail. + assert.throws(() => assertNativeRays(before, { ...result.leaf, style: before.style }, gutter), /Native picture ray moved/); + } +}); + +test('old cube edges and three-way corners lie inside multiple supports, with zero signal before new outer edges', () => { + for (const [i, basis] of SKY_BASES.entries()) { + assert.equal(faceWeights(basis.forwardIcrf, size, gutter)[i], 1); + for (const sign of [-1, 1]) { + const shared = faceWeights(skyRay(basis, sign, 0), size, gutter); + assert.equal([...shared].filter(value => value > 0).length, 2); + assert.equal(shared[i], .5); + const corner = faceWeights(skyRay(basis, sign, sign), size, gutter); + assert.equal([...corner].filter(value => value > 0).length, 3); + assert(Math.abs(corner[i]! - 1 / 3) < 1e-12); + // A formerly visible hard edge is now a nonzero interior. The new physical + // edge and its final full source-texel guard carry no emission or extinction. + assert(faceWeights(skyRay(basis, sign * (1 + 2 / size), 0), size, gutter)[i]! > 0); + assert.equal(faceWeights(skyRay(basis, sign * (extent - .5 / size), 0), size, gutter)[i], 0); + assert.equal(faceWeights(skyRay(basis, sign * extent, 0), size, gutter)[i], 0); + } + } +}); + +test('joint face opacities preserve source-over transmission at faint edges and corners without double light', () => { + for (const alpha of [0, 1 / 255, 2 / 255, 13 / 255, 23 / 255, 50 / 255, .5, .98, 1]) + for (const direction of [[1, 0, 1], [1, 1, 1], [1, .99, .98], [-1, -.99, 1], [1, 0, 0]] as const) { + const weights = faceWeights(direction, size, gutter), bytes = opticalBytes(alpha, weights); + const composite = 1 - [...bytes].reduce((transmission, value) => transmission * (1 - value / 255), 1); + assert(Math.abs(composite - alpha) <= .5 / 255 + 1e-12, `${alpha} became ${composite}`); + weights.forEach((weight, i) => { if (!weight) assert.equal(bytes[i], 0); }); + } +}); + +test('all expanded faces sample one common angular color and keep the unchanged central native pixels', () => { + const faces = fixture(23); + for (const basis of SKY_BASES) { + const weights = faceWeights(basis.forwardIcrf, size, gutter), common = samplePanorama(faces, basis.forwardIcrf, weights); + assert(Math.abs(common[3] - 23 / 255) < 1e-12); + } + for (let i = 0; i < faces.length; i++) { + assert.deepEqual(guardedPixel(faces, i, SKY_BASES[i]!.forwardIcrf, gutter), [197, 213, 241, 23]); + for (const coordinate of [-extent + 1 / size, extent - 1 / size]) assert.equal(guardedPixel(faces, i, skyRay(SKY_BASES[i]!, coordinate, 0), gutter)[3], 0); + } + const around = [-1e-7, 0, 1e-7].map(delta => samplePanorama(faces, [1, 0, 1 + delta], faceWeights([1, 0, 1 + delta], size, gutter))); + around.forEach(pixel => pixel.forEach((value, c) => assert(Math.abs(value - around[1]![c]!) < 1e-12))); +}); diff --git a/packages/bake/authoring/m45/dust/physics/config.mts b/packages/bake/authoring/m45/dust/physics/config.mts new file mode 100644 index 00000000000..4739a809fd3 --- /dev/null +++ b/packages/bake/authoring/m45/dust/physics/config.mts @@ -0,0 +1,22 @@ +import { readFile } from 'node:fs/promises'; +import { requireRecord,requireArray,requireFiniteNumber } from '@cssearth/core'; +import { PC,YEAR,unit,scale,dot,type Inputs,type Vec,type Star } from './types.mts'; +const rad=Math.PI/180; +export const skyDirection=(ra:number,dec:number):Vec=>[Math.cos(dec*rad)*Math.cos(ra*rad),Math.cos(dec*rad)*Math.sin(ra*rad),Math.sin(dec*rad)]; +const spectral=(temperature:number,radiusSolar:number,wavelengthNm:number)=>{const h=6.62607015e-34,c=299792458,k=1.380649e-23,w=wavelengthNm*1e-9,r=radiusSolar*6.957e8;return 8*Math.PI*Math.PI*h*c*c*r*r/(w**5*Math.expm1(h*c/(w*k*temperature)))*1e-9;}; +export async function loadInputs():Promise { + const normal=skyDirection(56.67978318,24.10845447),ra=56.67978318*rad,dec=24.10845447*rad,east:Vec=[-Math.sin(ra),Math.cos(ra),0],north:Vec=[-Math.sin(dec)*Math.cos(ra),-Math.sin(dec)*Math.sin(ra),Math.cos(dec)]; + const rows=(await readFile('src/objects/milky-way-pleiades-dust/source/inputs/named-stars.csv','utf8')).trim().split(/\r?\n/).slice(1).map(line=>{const p=line.split(',');return {hip:Number(p[0]),ra:Number(p[1]),dec:Number(p[2])};}); + const raw=requireRecord(JSON.parse(await readFile('src/objects/milky-way-pleiades-dust/source/inputs/stellar-inputs.json','utf8'))),masses=[5.9,4.74,3.42,4.7,4.22,4.25,4.41,3.8]; + const stars:Star[]=requireArray(raw.stars).map((v,i)=>{const s=requireRecord(v),name=String(s.name),hip=requireFiniteNumber(s.hip),row=rows.find(r=>r.hip===hip);if(!row)throw Error('Missing star');const ray=skyDirection(row.ra,row.dec),distance=136.7/dot(ray,normal),at:Vec=[distance*dot(ray,east),distance*dot(ray,north),.7],temperatureK=requireFiniteNumber(s.temperatureK),radiusSolar=requireFiniteNumber(s.publishedRadiusSolar)*distance/requireFiniteNumber(s.publishedReferenceDistancePc);return {name,hip,at,temperatureK,radiusSolar,massSolar:masses[i]!,luminositySolar:radiusSolar**2*(temperatureK/5772)**4,spectralWNm:[spectral(temperatureK,radiusSolar,805),spectral(temperatureK,radiusSolar,537),spectral(temperatureK,radiusSolar,436)]};}); + const grainRows=(await readFile('src/objects/milky-way-pleiades-dust/source/inputs/draine-rv31.txt','utf8')).split('\n').map(l=>l.trim().split(/\s+/).slice(0,6).map(Number)).filter(r=>r.length===6&&r.every(Number.isFinite)&&r[0]!>0).sort((l,r)=>l[0]!-r[0]!); + const at=(w:number,c:number)=>{const i=grainRows.findIndex(r=>r[0]!>=w);if(i<1)throw Error('Missing grain data');const lo=grainRows[i-1]!,hi=grainRows[i]!,f=(w-lo[0]!)/(hi[0]!-lo[0]!);return lo[c]!*(1-f)+hi[c]!*f;}; + const wavelengths=[.805,.537,.436],optical={albedo:wavelengths.map(w=>at(w,1)) as Vec,g:wavelengths.map(w=>at(w,2)) as Vec,extinctionRatio:wavelengths.map(w=>at(w,3)/at(.537,3)) as Vec}; + const meta=requireRecord(JSON.parse(await readFile('src/objects/milky-way-pleiades-dust/source/inputs/extinction/columns.json','utf8'))),mw=requireFiniteNumber(meta.width),mh=requireFiniteNumber(meta.height),ra0=requireFiniteNumber(meta.ra0),dec0=requireFiniteNumber(meta.dec0),dra=requireFiniteNumber(meta.raStep),ddec=requireFiniteNumber(meta.decStep); + const maps=await Promise.all(['edenhofer','leike'].map(async n=>{const buf=await readFile(`src/objects/milky-way-pleiades-dust/source/inputs/extinction/${n}-column.f32`),out=new Float32Array(buf.length/4);for(let i=0;i{const s=requireRecord(v);return {ra:requireFiniteNumber(s.ra),dec:requireFiniteNumber(s.dec),ebv:requireFiniteNumber(s.ebv)};}); + const mapAt=(m:Float32Array,ra:number,dec:number)=>{const x=Math.max(0,Math.min(mw-1.001,(ra-ra0)/dra)),y=Math.max(0,Math.min(mh-1.001,(dec-dec0)/ddec)),ix=Math.floor(x),iy=Math.floor(y),u=x-ix,v=y-iy;return m[iy*mw+ix]!*(1-u)*(1-v)+m[iy*mw+ix+1]!*u*(1-v)+m[(iy+1)*mw+ix]!*(1-u)*v+m[(iy+1)*mw+ix+1]!*u*v;}; + const columnEbv=(x:number,y:number)=>{const p:Vec=[136*normal[0]+x*east[0]+y*north[0],136*normal[1]+x*east[1]+y*north[1],136*normal[2]+x*east[2]+y*north[2]],r=Math.hypot(...p),ra=Math.atan2(p[1],p[0])/rad,dec=Math.asin(p[2]/r)/rad;let sum=0,weight=0;for(const m of members){const d2=((ra-m.ra)*Math.cos(dec*rad))**2+(dec-m.dec)**2,w=Math.exp(-d2/(2*.12**2));sum+=w*Math.max(0,m.ebv-.035);weight+=w;}const member=weight>1e-8?sum/weight:0;return Math.max(0,(mapAt(maps[0]!,ra,dec)+mapAt(maps[1]!,ra,dec)+member)/3);}; + const velocity:Vec=[-5.3,10,10.8],speedKmS=Math.hypot(...velocity),gasVelocityPcYr=scale(velocity,1000*YEAR/PC),upstream=scale(unit(velocity),-1); + return {stars,grains:[{radiusMicron:.05,weight:.25,materialDensityGcm3:3,qPr:1},{radiusMicron:.1,weight:.5,materialDensityGcm3:3,qPr:1},{radiusMicron:.2,weight:.25,materialDensityGcm3:3,qPr:1}],gasVelocityPcYr,upstream,speedKmS,columnEbv,grainOptical:optical,reference:{normal,east,north},metadata:{starSource:'White2017Table1; radii scaled consistently to adopted136.7pc normal-depth realization',columnSource:'mean Edenhofer/Leike120to150pc columns plus Breger excess above.035; member interpolation sigma.12deg',photoDensityDependency:false,flow:'conditional Herbig vector at historical118pc retained as a scenario, not a new measured global space motion',grainForce:'Qpr1 and coarse optical grain weights adopted'}}; +} diff --git a/packages/bake/authoring/m45/dust/physics/illumination.mts b/packages/bake/authoring/m45/dust/physics/illumination.mts new file mode 100644 index 00000000000..9e29d7ec213 --- /dev/null +++ b/packages/bake/authoring/m45/dust/physics/illumination.mts @@ -0,0 +1,25 @@ +import {PC,hg,type Vec} from './types.mts'; +import {loadIsrf} from './isrf.mts'; +import {grid,position,sample,type Grid} from '../field/grid.mts'; +import type {Field} from '../field/density.mts'; + +export type LightComponent='all'|'stellar'|'galactic'; +export interface Transport {density(x:number,y:number,z:number):number;source(back:Vec,eye?:Vec,component?:LightComponent):{at(x:number,y:number,z:number,out:Float64Array):void};metadata:Record} +const contains=(g:Grid,x:number,y:number,z:number)=>x>=g.min[0]&&x<=g.max[0]&&y>=g.min[1]&&y<=g.max[1]&&z>=g.min[2]&&z<=g.max[2]; +function outgoingGrid(g:Grid,back:Vec):Grid{const axis=back.findIndex(v=>v!==0),positive=back[axis]!>0,result=grid(g.min,g.max,g.shape),step=(g.max[axis]!-g.min[axis]!)/(g.shape[axis]!-1),other=[0,1,2].filter(a=>a!==axis),p=[0,0,0],index=()=>((p[2]!*g.shape[1]+p[1]!)*g.shape[0]+p[0]!);for(let u=0;u{ + const start=Date.now(),isrf=await loadIsrf(),densityGrids=[grid([-4,-4,-6],[4,4,6],[129,129,193]),grid([-12,-12,-16],[12,12,12],[65,65,65]),grid(field.bounds.min,field.bounds.max,[65,65,65])]; + for(const[gIndex,g]of densityGrids.entries()){for(let z=0;z{const g=densityGrids.find(g=>contains(g,x,y,z));if(!g)return 0;sample(g,x,y,z,dp);return dp[0]!;}; + const opticalGrids=[grid([-4,-4,-6],[4,4,6],[65,65,97],field.inputs.stars.length),grid([-12,-12,-16],[12,12,12],[33,33,33],field.inputs.stars.length),grid(field.bounds.min,field.bounds.max,[25,25,25],field.inputs.stars.length)]; + for(const[gIndex,g]of opticalGrids.entries()){for(let z=0;zdensityGrids.map(g=>outgoingGrid(g,back))),escapeScratch=new Float64Array(1); + const escapeAt=(direction:number,x:number,y:number,z:number)=>{let sum=0,p:Vec=[x,y,z];const axis=Math.floor(direction/2),positive=direction%2===0;for(const g of escape[direction]!){if(!contains(g,...p))continue;sample(g,...p,escapeScratch);sum+=escapeScratch[0]!;p[axis]=positive?g.max[axis]!:g.min[axis]!;}return sum;}; + const illuminate=(back:Vec,x:number,y:number,z:number,out:Float64Array,component:LightComponent)=>{const g=opticalGrids.find(g=>contains(g,x,y,z));tau.fill(0);if(g)sample(g,x,y,z,tau);const escapeTau=directions.map((_,i)=>escapeAt(i,x,y,z));for(let c=0;c<3;c++){let sum=0,normalization=0;for(let d=0;d<6;d++){const v=directions[d]!,phase=hg(-v[0]*back[0]-v[1]*back[1]-v[2]*back[2],opt.g[c]!);sum+=phase*Math.exp(-escapeTau[d]!*opt.extinctionRatio[c]!);normalization+=phase;}out[c]=component==='stellar'?0:isrf[c]!*opt.extinctionRatio[c]!*opt.albedo[c]!*sum/normalization;}if(component!=='galactic')for(const[i,star]of field.inputs.stars.entries()){const dx=x-star.at[0],dy=y-star.at[1],dz=z-star.at[2],r2=dx*dx+dy*dy+dz*dz;if(r2<1e-8)continue;const r=Math.sqrt(r2),mu=(dx*back[0]+dy*back[1]+dz*back[2])/r;for(let c=0;c<3;c++)out[c]!+=star.spectralWNm[c]!/(4*Math.PI*r2*PC*PC*1e-8)*opt.extinctionRatio[c]!*opt.albedo[c]!*hg(mu,opt.g[c]!)*Math.exp(-tau[i]!*opt.extinctionRatio[c]!);}}; + return {density,source(back,eye,component='all'){const grids=[grid([-4,-4,-6],[4,4,6],[129,129,193],3),grid([-12,-12,-16],[12,12,12],[65,65,65],3),grid(field.bounds.min,field.bounds.max,[33,33,33],3)],v=new Float64Array(3),outgoing=densityGrids.map(g=>outgoingGrid(g,back)),scratch=new Float64Array(1),axis=back.findIndex(v=>v!==0),positive=back[axis]!>0; + const finiteEscape=eye?opticalGrids.map(g=>grid(g.min,g.max,g.shape)):null; + if(eye&&finiteEscape)for(const g of finiteEscape){for(let z=0;z{if(finiteEscape){const g=finiteEscape.find(g=>contains(g,x,y,z));if(!g)return 0;sample(g,x,y,z,scratch);return scratch[0]!;}let sum=0,p:Vec=[x,y,z];for(let i=0;i1e-9)view=[dx/d,dy/d,dz/d];}illuminate(view,...p,v,component);const tau=outgoingAt(...p);for(let c=0;c<3;c++)v[c]!*=Math.exp(-tau*opt.extinctionRatio[c]!);g.data.set(v,((z*g.shape[1]+y)*g.shape[0]+x)*3);}console.log('PLEIADES_SOURCE_CACHE_READY',JSON.stringify({back,grid:gIndex,seconds:(Date.now()-start)/1000}));}return{at(x,y,z,out){const g=grids.find(g=>contains(g,x,y,z));if(!g){out.fill(0);return;}sample(g,x,y,z,out);}};},metadata:{isrf:'fixed published Draine2021modifiedMMPU1; same isotropic boundary intensity everywhere; six-direction HG-weighted incoming attenuation, normalized to recover unattenuated isotropy exactly',lighting:'published B-star spectral luminosities, exact1/r² and HG at cache nodes, same Draine grains; incident and complete outgoing Beer-Lambert',densityCacheShapes:densityGrids.map(g=>g.shape),incidentCacheShapes:opticalGrids.map(g=>g.shape),incidentSteps:'16–96 midpoint samples, using prepared three-resolution density; no fitted radiation amplitude',finiteStationOutgoing:'Finite camera-to-dust rays,8–128midpoints and three optical-cache levels; extinction stops at actual prepared observer, phase uses point-to-observer direction',outgoing:'For distant reference photometry: cardinal cumulative trapezoids, stitched fine→regional→wide at actual domain exits; each point already attenuated before cellular partition, no duplicated front extinction',limitations:['Incident attenuation and radiance interpolated from finite caches; unresolved cavities smaller than a cache cell remain uncertain.','Six angular rays approximate the attenuated Galactic field; the boundary lies on this finite regional map.','Only the fixed Earth-reference scattering field is installed; source calculations run offline.']}}; +} diff --git a/packages/bake/authoring/m45/dust/physics/isrf.mts b/packages/bake/authoring/m45/dust/physics/isrf.mts new file mode 100644 index 00000000000..370fc877bf9 --- /dev/null +++ b/packages/bake/authoring/m45/dust/physics/isrf.mts @@ -0,0 +1,170 @@ +/** Published solar-neighborhood mMMP spectrum -> fixed optical mean intensity; offline preparation only. */ +import { readFile, writeFile } from 'node:fs/promises'; +import { resolve } from 'node:path'; +import { gunzipSync } from 'node:zlib'; +import { hg, type Vec } from './types.mts'; + +export const ISRF_SOURCE_URL = 'https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz'; +export const ISRF_WAVELENGTH_MICRON: Vec = [.805, .537, .436]; // Display-channel order I/V/B, matching Pleiades stars. +export const ISRF_RADIANCE_UNIT = 1e-8; // W m^-2 sr^-1 nm^-1, the model linear radiance unit. +const ROOT = `${resolve('src/objects/milky-way-pleiades-dust/source/inputs/isrf')}/`, SOURCE_PATH = `${ROOT}isrf-mmpisrf_0.00.gz`, RECORD_PATH = `${ROOT}optical-field.json`; +const C = 299792458, H = 6.62607015e-34, K = 1.380649e-23; +const SCHEMA = 'pleiades-wide-optical-isrf@1'; +interface SpectrumRow { wavelengthMicron: number; lambdaULambdaErgCm3: number } +interface Spectrum { rows: SpectrumRow[]; uTotalErgCm3: number; uStarlightErgCm3: number; U: number } +export interface IsrfMetadata { + schema: typeof SCHEMA; + model: string; + sourceUrl: string; + paperUrl: string; + wavelengthMicron: Vec; + channelOrder: string[]; + jWm2SrNm: Vec; + jModelRadiance: Vec; + radianceUnitWm2SrNm: number; + uStarlightErgCm3: number; + sourceUnits: string; + conversion: string; + scatteringSource: string; + assumptions: string[]; + checks: Record; +} +const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value); +const record = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value); +function require(condition: boolean, message: string): void { if (!condition) throw Error(message); } +function vector(value: unknown, name: string): Vec { + if (!Array.isArray(value) || value.length !== 3 || !value.every(finite)) throw Error(`Invalid ${name}`); + return [value[0]!, value[1]!, value[2]!]; +} +function parseSpectrum(text: string): Spectrum { + require(text.includes('lambda*u_lambda') && text.includes('(erg cm-3)') && text.includes('(um)'), 'Published spectrum units/header changed.'); + const lines = text.split(/\r?\n/u), rows: SpectrumRow[] = []; + const header = (label: string) => { const line = lines.find(line => line.includes(label)); if (!line) throw Error(`Source lacks ${label}`); const value = Number(line.trim().split(/\s+/u)[0]); require(Number.isFinite(value) && value > 0, `Invalid ${label}`); return value; }; + for (const line of lines) { + const m = /^\s*([\d.Ee+\-]+)\s+([\d.Ee+\-]+)\s*$/u.exec(line); if (!m) continue; + const wavelengthMicron = Number(m[1]), lambdaULambdaErgCm3 = Number(m[2]); + require(Number.isFinite(wavelengthMicron) && wavelengthMicron > 0 && Number.isFinite(lambdaULambdaErgCm3) && lambdaULambdaErgCm3 >= 0, 'Invalid tabulated ISRF sample.'); + rows.push({ wavelengthMicron, lambdaULambdaErgCm3 }); + } + require(rows.length === 2500 && rows[0]!.wavelengthMicron === .0912 && rows.at(-1)!.wavelengthMicron === 8000, 'Published 2500-point ISRF wavelength grid changed.'); + require(rows.every((row, i) => i === 0 || row.wavelengthMicron > rows[i - 1]!.wavelengthMicron), 'ISRF wavelengths are not increasing.'); + const U = header('= U (heating rate factor)'), uTotalErgCm3 = header('= u( h nu'), uStarlightErgCm3 = header('= u_starlight'); + require(U === 1 && uStarlightErgCm3 === 1.043e-12 && uTotalErgCm3 === 1.460e-12, 'Unexpected normalization of the fixed published mMMP spectrum.'); + return { rows, U, uTotalErgCm3, uStarlightErgCm3 }; +} +function interpolateSpectrum(rows: SpectrumRow[], wavelengthMicron: number): number { + require(wavelengthMicron >= rows[0]!.wavelengthMicron && wavelengthMicron <= rows.at(-1)!.wavelengthMicron, 'ISRF requested outside the published spectrum.'); + let a = 0, b = rows.length - 1; + while (b - a > 1) { const middle = (a + b) >>> 1; if (rows[middle]!.wavelengthMicron < wavelengthMicron) a = middle; else b = middle; } + const low = rows[a]!, high = rows[b]!, t = Math.log(wavelengthMicron / low.wavelengthMicron) / Math.log(high.wavelengthMicron / low.wavelengthMicron); + require(low.lambdaULambdaErgCm3 > 0 && high.lambdaULambdaErgCm3 > 0, 'Cannot logarithmically interpolate a zero-energy optical bin.'); + return Math.exp((1 - t) * Math.log(low.lambdaULambdaErgCm3) + t * Math.log(high.lambdaULambdaErgCm3)); +} +/** lambda*u_lambda[erg/cm^3] -> J_lambda[W/m^2/sr/nm], via u_lambda=4*pi*J_lambda/c. */ +function meanIntensitySI(lambdaULambdaErgCm3: number, wavelengthMicron: number): number { + return C / (4 * Math.PI) * (lambdaULambdaErgCm3 * .1) / (wavelengthMicron * 1000); +} +function dilutedBlackbodySI(wavelengthMicron: number): number { + const wavelengthM = wavelengthMicron * 1e-6; + let sum = 0; + // Published mMMP parameters: Draine2011 Table12.1 and Draine etal2021 section2.1. + for (const [temperature, dilution] of [[3000, 7e-13], [4000, 1.65e-13], [7500, 1e-14]]) + sum += dilution! * 2 * H * C * C / (wavelengthM ** 5 * Math.expm1(H * C / (wavelengthM * K * temperature!))) * 1e-9; + return sum; +} +function energyIntegral(rows: SpectrumRow[], maximumMicron: number): number { + let sum = 0; + for (let i = 1; i < rows.length; i++) { + const a = rows[i - 1]!, b = rows[i]!; if (a.wavelengthMicron >= maximumMicron) break; + const end = Math.min(maximumMicron, b.wavelengthMicron), q = end === b.wavelengthMicron ? b.lambdaULambdaErgCm3 : interpolateSpectrum(rows, end); + sum += .5 * (a.lambdaULambdaErgCm3 + q) * Math.log(end / a.wavelengthMicron); + } + return sum; +} +function simpson(f: (x: number) => number, a: number, b: number, intervals: number): number { + require(intervals % 2 === 0, 'Simpson quadrature needs an even interval count.'); + const step = (b - a) / intervals; let sum = f(a) + f(b); + for (let i = 1; i < intervals; i++) sum += f(a + i * step) * (i % 2 ? 4 : 2); + return sum * step / 3; +} +function numericalChecks(spectrum: Spectrum, jWm2SrNm: Vec): Record { + const integratedStarlight = energyIntegral(spectrum.rows, 100), integratedTotal = energyIntegral(spectrum.rows, 8000); + const stellarEnergyRelativeError = Math.abs(integratedStarlight / spectrum.uStarlightErgCm3 - 1), totalEnergyRelativeError = Math.abs(integratedTotal / spectrum.uTotalErgCm3 - 1); + // The author's tabulated spectrum integrates0.52% above its stated starlight header. Preserve it, do not refit/rescale. + require(stellarEnergyRelativeError < .01 && totalEnergyRelativeError < .002, `Tabulated ISRF normalization discrepancy: starlight=${integratedStarlight}/${spectrum.uStarlightErgCm3}, total=${integratedTotal}/${spectrum.uTotalErgCm3}.`); + const opticalShape = ISRF_WAVELENGTH_MICRON.map((wave, c) => { + const analytic = dilutedBlackbodySI(wave), relativeError = Math.abs(jWm2SrNm[c]! / analytic - 1); + require(relativeError < .002, 'Optical table does not reproduce the published mMMP diluted-blackbody shape/normalization.'); + const q = interpolateSpectrum(spectrum.rows, wave), independentlyInCgs = C * 100 / (4 * Math.PI) * q / wave * 1e-6; + require(Math.abs(independentlyInCgs / jWm2SrNm[c]! - 1) < 1e-12, 'cgs/SI/per-micron/per-nm conversion is inconsistent.'); + return { wavelengthMicron: wave, tableJ_Wm2srNm: jWm2SrNm[c], analyticJ_Wm2srNm: analytic, relativeError }; + }); + const phaseIntegrals = [0, .4369642659, .5415102086, .5661675121, .74].map(g => { + const integral = 2 * Math.PI * simpson(mu => hg(mu, g), -1, 1, 8192); + require(Math.abs(integral - 1) < 1e-8, 'Normalized HG does not integrate to one over isotropic illumination.'); + return { g, integral }; + }); + const jInternal: Vec = [jWm2SrNm[0] / ISRF_RADIANCE_UNIT, jWm2SrNm[1] / ISRF_RADIANCE_UNIT, jWm2SrNm[2] / ISRF_RADIANCE_UNIT]; + const extinctionRatio: Vec = [.5661236548558769, 1, 1.2754697849292016], albedo: Vec = [.6537290858725762, .6771989529652352, .6651649758454107]; + const slab = [0, .01, .1, 1, 3].map(tauV => { + let maximumRelativeError = 0; + for (let c = 0; c < 3; c++) { + const tau = tauV * extinctionRatio[c]!, exact = albedo[c]! * jInternal[c]! * -Math.expm1(-tau), count = 4096, dt = tau / count; + let numerical = 0; for (let i = 0; i < count; i++) numerical += albedo[c]! * jInternal[c]! * dt * Math.exp(-(i + .5) * dt); + if (tau === 0) require(numerical === 0 && exact === 0, 'Zero dust generated ISRF light.'); + else maximumRelativeError = Math.max(maximumRelativeError, Math.abs(numerical / exact - 1)); + } + require(maximumRelativeError < 1e-7, 'Outgoing-attenuated ISRF slab fails its analytic transport check.'); return { tauV, maximumRelativeError }; + }); + return { success: true, sourceRows: spectrum.rows.length, integratedStarlightErgCm3Below100um: integratedStarlight, publishedStarlightErgCm3: spectrum.uStarlightErgCm3, stellarEnergyRelativeError, + energyHeaderDifference: 'As-published table integrates0.52% above its stated starlight header. No amplitude renormalization applied; source-level1% agreement tolerance, not a fitted value.', + integratedTotalErgCm3Through8000um: integratedTotal, publishedTotalIncludingCmbErgCm3: spectrum.uTotalErgCm3, totalEnergyRelativeError, opticalShape, phaseIntegrals, outgoingSlab: slab, + zeroDensityZeroLight: true, zeroIlluminationZeroLight: true, isotropicSourceHasNoAdditional4pi: true }; +} + +function parseMetadata(value: unknown): IsrfMetadata { + if (!record(value) || value.schema !== SCHEMA || value.sourceUrl !== ISRF_SOURCE_URL || value.radianceUnitWm2SrNm !== ISRF_RADIANCE_UNIT || typeof value.model !== 'string' || typeof value.paperUrl !== 'string' || typeof value.sourceUnits !== 'string' || typeof value.conversion !== 'string' || typeof value.scatteringSource !== 'string' || !record(value.checks) || value.checks.success !== true) throw Error('Invalid prepared optical ISRF.'); + const wavelengthMicron = vector(value.wavelengthMicron, 'wavelengths'), jWm2SrNm = vector(value.jWm2SrNm, 'physical mean intensity'), jModelRadiance = vector(value.jModelRadiance, 'Pleiades mean intensity'); + require(wavelengthMicron.every((wave, i) => wave === ISRF_WAVELENGTH_MICRON[i]) && jWm2SrNm.every((j, i) => j > 0 && jModelRadiance[i]! > 0 && Math.abs(jModelRadiance[i]! * ISRF_RADIANCE_UNIT / j - 1) < 1e-12), 'ISRF channel units/order changed.'); + if (!Array.isArray(value.channelOrder) || !value.channelOrder.every(v => typeof v === 'string') || !Array.isArray(value.assumptions) || !value.assumptions.every(v => typeof v === 'string') || !finite(value.uStarlightErgCm3)) throw Error('Malformed ISRF description.'); + return { schema: SCHEMA, model: value.model, sourceUrl: value.sourceUrl, paperUrl: value.paperUrl, wavelengthMicron, channelOrder: value.channelOrder, jWm2SrNm, jModelRadiance, radianceUnitWm2SrNm: ISRF_RADIANCE_UNIT, uStarlightErgCm3: value.uStarlightErgCm3, + sourceUnits: value.sourceUnits, conversion: value.conversion, scatteringSource: value.scatteringSource, assumptions: value.assumptions, checks: value.checks }; +} +/** Fixed I/V/B J_lambda in Pleiades units of1e-8 W/m2/sr/nm. No network or source fitting. */ +export async function loadIsrf(): Promise { const value = await loadIsrfMetadata(); return [...value.jModelRadiance]; } +/** Use this SI helper when adding the field to the older physical-W/m2/sr/nm regional bake. */ +export async function loadIsrfSI(): Promise { const value = await loadIsrfMetadata(); return [...value.jWm2SrNm]; } +export async function loadIsrfMetadata(): Promise { return parseMetadata(JSON.parse(await readFile(RECORD_PATH, 'utf8'))); } +/** rhoV is V optical depth per pc. Result is radiance per pc in the same units as supplied J. */ +export function isrfSourcePerPc(rhoV: number, extinctionRatio: Vec, albedo: Vec, J: Vec): Vec { + require(finite(rhoV) && rhoV >= 0 && extinctionRatio.every(v => finite(v) && v >= 0) && albedo.every(v => finite(v) && v >= 0 && v <= 1) && J.every(v => finite(v) && v >= 0), 'Invalid diffuse scattering source input.'); + return [rhoV * extinctionRatio[0] * albedo[0] * J[0], rhoV * extinctionRatio[1] * albedo[1] * J[1], rhoV * extinctionRatio[2] * albedo[2] * J[2]]; +} +async function prepare(): Promise { + let bytes: Buffer; + try { bytes = await readFile(SOURCE_PATH); } + catch (error: unknown) { + if (!record(error) || error.code !== 'ENOENT') throw error; + const response = await fetch(ISRF_SOURCE_URL, { signal: AbortSignal.timeout(30_000) }); if (!response.ok) throw Error(`Published ISRF download ${response.status}`); + bytes = Buffer.from(await response.arrayBuffer()); require(bytes.length < 100_000, 'Unexpected ISRF source size.'); await writeFile(SOURCE_PATH, bytes); + } + const text = gunzipSync(bytes, { maxOutputLength: 500_000 }).toString('utf8'), spectrum = parseSpectrum(text); + const jWm2SrNm: Vec = [0, 0, 0]; + for (let c = 0; c < 3; c++) jWm2SrNm[c] = meanIntensitySI(interpolateSpectrum(spectrum.rows, ISRF_WAVELENGTH_MICRON[c]!), ISRF_WAVELENGTH_MICRON[c]!); + const checks = numericalChecks(spectrum, jWm2SrNm), metadata: IsrfMetadata = { + schema: SCHEMA, model: 'Draine etal2021 modified Mathis-Mezger-Panagia solar-neighborhood starlight field, U=1', sourceUrl: ISRF_SOURCE_URL, + paperUrl: 'https://doi.org/10.3847/1538-4357/abff51', wavelengthMicron: [...ISRF_WAVELENGTH_MICRON], channelOrder: ['I (red display lane)', 'V (green display lane)', 'B (blue display lane)'], + jWm2SrNm, jModelRadiance: [jWm2SrNm[0] / ISRF_RADIANCE_UNIT, jWm2SrNm[1] / ISRF_RADIANCE_UNIT, jWm2SrNm[2] / ISRF_RADIANCE_UNIT], radianceUnitWm2SrNm: ISRF_RADIANCE_UNIT, uStarlightErgCm3: spectrum.uStarlightErgCm3, + sourceUnits: 'lambda[um],lambda*u_lambda[erg/cm3]; source includes CMB, negligible at requested optical wavelengths', + conversion: 'J_lambda[W/m2/sr/nm]=c/(4*pi)*(lambda*u_lambda[erg/cm3]*0.1)/(lambda[um]*1000); Pleiades units divide by1e-8', + scatteringSource: 'j_lambda per pc=rhoV[1/pc]*Cext(lambda)/CextV*albedo(lambda)*J_lambda; isotropic incident intensity and unit-normalized HG integrate to J with no extra4pi factor; propagate exp(-tauOutgoing(lambda))', + assumptions: ['Published mMMP model adopted uniformly and isotropically over this regional model; not a measured local angular field at the Pleiades', 'Use the same fixed U=1 amplitude and spectrum everywhere; no per-position color or ambient floor', 'Single optical scattering; outgoing extinction mandatory', 'Uniform isotropic boundary intensity; the transport applies its declared incoming shielding.', 'CMB and thermal infrared emission do not contribute measurable B/V/I illumination here', 'Three monochromatic optical samples, not integrated filter/colorimetric photometry'], checks, + }; + require(isrfSourcePerPc(0, [1, 1, 1], [1, 1, 1], metadata.jModelRadiance).every(v => v === 0), 'Zero density source check failed.'); + require(isrfSourcePerPc(1, [1, 1, 1], [1, 1, 1], [0, 0, 0]).every(v => v === 0), 'Zero illumination source check failed.'); + await writeFile(`${ROOT}isrf-mmpisrf_0.00.txt`, text); + await writeFile(RECORD_PATH, JSON.stringify({ ...metadata, sourceBytes: bytes.length, sourceDescription: 'Author-hosted tabulation linked by PAHspec.html, file isrf_mmpisrf_0.00.gz', sourcePageUrl: 'https://www.astro.princeton.edu/~draine/PAHspec/PAHspec.html', modifications: 'mMMP raises3000K dilution4e-13to7e-13 and4000K dilution1e-13to1.65e-13;7500K stays1e-14', generator: 'packages/bake/authoring/m45/dust/physics/isrf.mts' }, null, 2) + '\n'); + const replay = await loadIsrf(); require(replay.every((v, i) => v === metadata.jModelRadiance[i]), 'Prepared ISRF replay changed values.'); + console.log(JSON.stringify({ success: true, signal: 'WIDE_ISRF_READY', sourceBytes: bytes.length, sourceRows: spectrum.rows.length, wavelengthMicron: ISRF_WAVELENGTH_MICRON, jWm2SrNm, jModelRadiance: replay, checks })); +} +if (import.meta.main) { require(process.argv.length === 2, 'Run this module from the repository root without arguments.'); await prepare(); } diff --git a/packages/bake/authoring/m45/dust/physics/types.mts b/packages/bake/authoring/m45/dust/physics/types.mts new file mode 100644 index 00000000000..e4d2ea16ffb --- /dev/null +++ b/packages/bake/authoring/m45/dust/physics/types.mts @@ -0,0 +1,10 @@ +export type Vec = [number, number, number]; +export interface Star { name:string; hip:number; at:Vec; temperatureK:number; radiusSolar:number; massSolar:number; luminositySolar:number; spectralWNm:Vec } +export interface Grain { radiusMicron:number; weight:number; materialDensityGcm3:number; qPr:number } +export interface Inputs { stars:Star[]; grains:Grain[]; gasVelocityPcYr:Vec; upstream:Vec; speedKmS:number; columnEbv(x:number,y:number):number; grainOptical:{albedo:Vec;g:Vec;extinctionRatio:Vec}; reference:{normal:Vec;east:Vec;north:Vec}; metadata:Record } +export const PC=3.085677581491367e16,YEAR=365.25*86400; +export const scale=(a:Vec,k:number):Vec=>[a[0]*k,a[1]*k,a[2]*k]; +export const dot=(a:Vec,b:Vec)=>a[0]*b[0]+a[1]*b[1]+a[2]*b[2]; +export const unit=(v:Vec):Vec=>scale(v,1/Math.hypot(...v)); +export const clamp=(x:number,lo:number,hi:number)=>Math.max(lo,Math.min(hi,x)); +export const hg=(mu:number,g:number)=>(1-g*g)/(4*Math.PI*(1+g*g-2*g*clamp(mu,-1,1))**1.5); diff --git a/packages/bake/authoring/m45/dust/tsconfig.json b/packages/bake/authoring/m45/dust/tsconfig.json new file mode 100644 index 00000000000..ddcc5c240c0 --- /dev/null +++ b/packages/bake/authoring/m45/dust/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../../../../site/tsconfig.json", + "compilerOptions": { + "incremental": false, + "module": "NodeNext", + "moduleResolution": "NodeNext", + "typeRoots": ["../../../../../packages/engine/node_modules/@types"], + "types": ["node"] + }, + "include": ["./**/*.mts"], + "exclude": [] +} diff --git a/packages/objects/src/image-layer-bank.test.ts b/packages/objects/src/image-layer-bank.test.ts index 9c9c534fd1e..e1754b5ccaa 100644 --- a/packages/objects/src/image-layer-bank.test.ts +++ b/packages/objects/src/image-layer-bank.test.ts @@ -1,7 +1,8 @@ import { test } from 'node:test'; import assert from 'node:assert/strict'; import { isDeepStrictEqual } from 'node:util'; -import { parseImageLayerBankDescriptor } from './image-layer-bank.js'; +import { bankOverlays, parseImageLayerBankDescriptor } from './image-layer-bank.js'; +import { parseObjectDescriptor } from './parse.js'; function descriptor() { return { schema: 'cssearth-object@2', id: 'cloud', type: 'image-layer-bank', properties: { @@ -35,3 +36,17 @@ test('a bank names its datasets and what each draws over its layers, the first t assert.throws(() => parseImageLayerBankDescriptor({ ...descriptor(), properties: { ...descriptor().properties, cloudPoints: ['outer-ejecta'] } }), /Unknown image-layer property: cloudPoints/u, 'the overlays replaced cloudPoints: a descriptor that still names it is refused'); }); + +test('volume banks use the same contained dataset-overlay references; undeclared overlays draw nothing', () => { + const volume = (overlays?: unknown) => parseObjectDescriptor({ ...descriptor(), type: 'volume-dataset-bank', properties: { + ...descriptor().properties, ...(overlays === undefined ? {} : { overlays }) } }); + assert.deepEqual(bankOverlays(volume()), {}); + const source = { optical: ['dust', 'gas'], model: [] }; + const parsed = bankOverlays(volume(source)); + assert.deepEqual(parsed, source); + assert.ok(Object.isFrozen(parsed) && Object.isFrozen(parsed.optical)); + source.optical.push('later'); + assert.deepEqual(parsed.optical, ['dust', 'gas'], 'the validated record owns its arrays'); + for (const overlays of [null, [], {}, { optical: ['../cloud'] }, { optical: ['cloud.bin'] }, { optical: ['a', 'a'] }]) + assert.throws(() => bankOverlays(volume(overlays)), /properties.overlays maps dataset ids to distinct bank ids/u); +}); diff --git a/packages/objects/src/image-layer-bank.ts b/packages/objects/src/image-layer-bank.ts index c277082f964..e75e53a2d1e 100644 --- a/packages/objects/src/image-layer-bank.ts +++ b/packages/objects/src/image-layer-bank.ts @@ -30,17 +30,25 @@ export function bankCataloguePoints(descriptor: ObjectDescriptor): readonly stri return Object.freeze([...cataloguePoints as string[]]); } +/** Dataset-selected cloud overlay banks, shared by image and volume banks. Each id resolves to `prepared/.bin`. + * Absence means no overlays; a declared map is nonempty and retains its dataset order. */ +export function bankOverlays(descriptor: ObjectDescriptor): Readonly> { + const overlays = descriptor.properties.overlays; + if (overlays === undefined) return Object.freeze({}); + const id = (value: unknown) => typeof value === 'string' && /^[a-z][a-z0-9-]*$/u.test(value); + if (!overlays || typeof overlays !== 'object' || Array.isArray(overlays) || !Object.keys(overlays).length || + !Object.entries(overlays).every(([dataset, banks]) => id(dataset) && Array.isArray(banks) && banks.every(id) && new Set(banks).size === banks.length)) + throw new TypeError(`src/objects/${descriptor.id}/object.json properties.overlays maps dataset ids to distinct bank ids, not ${JSON.stringify(overlays)}.`); + return Object.freeze(Object.fromEntries(Object.entries(overlays as Record).map(([dataset, banks]) => [dataset, Object.freeze([...banks])]))); +} + export function parseImageLayerBankDescriptor(input: unknown): ImageLayerBankDescriptor { const descriptor = parseObjectDescriptor(input); if (descriptor.type !== 'image-layer-bank') throw new TypeError('Object is not an image-layer bank.'); const properties = descriptor.properties; const unknown = Object.keys(properties).filter(key => !['frame', 'preparation', 'cataloguePoints', 'overlays', 'host', 'surrounds'].includes(key)); if (unknown.length) throw new TypeError(`Unknown image-layer property: ${unknown.join(', ')}.`); - const cataloguePoints = bankCataloguePoints(descriptor), overlays = properties.overlays === undefined ? { optical: [] } : properties.overlays; - const id = (value: unknown) => typeof value === 'string' && /^[a-z][a-z0-9-]*$/u.test(value); - if (!overlays || typeof overlays !== 'object' || Array.isArray(overlays) || !Object.keys(overlays).length || - !Object.entries(overlays).every(([dataset, banks]) => id(dataset) && Array.isArray(banks) && banks.every(id) && new Set(banks).size === banks.length)) - throw new TypeError(`src/objects/${descriptor.id}/object.json properties.overlays maps dataset ids to distinct bank ids, not ${JSON.stringify(overlays)}.`); + const cataloguePoints = bankCataloguePoints(descriptor), overlays = properties.overlays === undefined ? Object.freeze({ optical: Object.freeze([]) }) : bankOverlays(descriptor); if (properties.surrounds !== undefined && properties.surrounds !== true) throw new TypeError(`src/objects/${descriptor.id}/object.json properties.surrounds is true or absent, not ${JSON.stringify(properties.surrounds)}.`); if (properties.host !== undefined && (typeof properties.host !== 'string' || !/^[a-z][a-z0-9-]*$/u.test(properties.host))) throw new TypeError(`src/objects/${descriptor.id}/object.json properties.host is an object id or absent, not ${JSON.stringify(properties.host)}.`); const frame = parseDensityVolumeFrame(properties.frame); @@ -53,6 +61,6 @@ export function parseImageLayerBankDescriptor(input: unknown): ImageLayerBankDes throw new TypeError('Image-layer preparation must be a contained source.'); } return Object.freeze({ ...descriptor, type: 'image-layer-bank', frame, - preparation: Object.freeze({ source: reference.source }), cataloguePoints, overlays: Object.freeze(Object.fromEntries(Object.entries(overlays as Record).map(([dataset, banks]) => [dataset, Object.freeze([...banks])]))), surrounds: properties.surrounds === true, + preparation: Object.freeze({ source: reference.source }), cataloguePoints, overlays, surrounds: properties.surrounds === true, host: typeof properties.host === 'string' ? properties.host : undefined }); } diff --git a/packages/objects/src/index.ts b/packages/objects/src/index.ts index 4321364a4bb..14ce5b7ea9c 100644 --- a/packages/objects/src/index.ts +++ b/packages/objects/src/index.ts @@ -1,7 +1,7 @@ export type { JsonValue, JsonRecord, ObjectDescriptor, PreparedAssetReference, PreparedObject } from './descriptor.js'; export { parseObjectDescriptor } from './parse.js'; export { objectPageCss } from './page-style.js'; -export { bankCataloguePoints, parseImageLayerBankDescriptor } from './image-layer-bank.js'; +export { bankCataloguePoints, bankOverlays, parseImageLayerBankDescriptor } from './image-layer-bank.js'; export type { ImageLayerBankDescriptor } from './image-layer-bank.js'; export { parseCataloguePointBankDescriptor } from './catalogue-point-bank.js'; export type { CataloguePointBankDescriptor } from './catalogue-point-bank.js'; @@ -19,6 +19,7 @@ export * from './registry/index.js'; export { PREPARED_BINARY_MAGIC, shufflePreparedBinary, unshufflePreparedBinary } from './prepared-binary.js'; export type { PreparedBinaryRegion } from './prepared-binary.js'; export { PREPARED_BANK_MAGIC, encodePreparedBank, decodePreparedBank, preparedBankColumn } from './prepared-bank.js'; +export { PREPARED_POINT_TRANSMISSION_SCHEMA, parsePointTransmission, type PreparedPointTransmission } from './prepared-data/catalogue/point-transmission.js'; export type { PreparedBank, PreparedBankColumn, PreparedBankColumnType } from './prepared-bank.js'; export * from './volume/emission/cloud-density-filter.js'; export * from './volume/compiler/compiler-bake.js'; diff --git a/packages/objects/src/prepared-data/catalogue/point-transmission.ts b/packages/objects/src/prepared-data/catalogue/point-transmission.ts new file mode 100644 index 00000000000..9a8defbfd74 --- /dev/null +++ b/packages/objects/src/prepared-data/catalogue/point-transmission.ts @@ -0,0 +1,34 @@ +import { parseDensityVolumeFrame, type DensityVolumeFrame } from '../../density-volume.js'; +import { preparedBankColumn, type PreparedBank } from '../../prepared-bank.js'; +export const PREPARED_POINT_TRANSMISSION_SCHEMA = 'cssearth-point-transmission@1'; + +export interface PreparedPointTransmission { + readonly frame: DensityVolumeFrame; + readonly targetAxes: readonly (readonly number[])[]; + readonly observerAxes: readonly (readonly number[])[]; + /** Optical depth already integrated by the bake, in thousandths. Observer-major, then target XYZ. */ + readonly tau: Uint16Array; + readonly thresholds: readonly number[]; + /** Prepared sRGB output byte, indexed by extinction level, RGB channel, then input sRGB byte. */ + readonly colors: Uint8Array; +} + +export function parsePointTransmission(bank: PreparedBank): PreparedPointTransmission { + if (bank.schema !== PREPARED_POINT_TRANSMISSION_SCHEMA) throw new TypeError('Expected prepared point transmission.'); + const { targetAxes, observerAxes, thresholds } = bank.fields; + const axes = (raw: unknown): readonly (readonly number[])[] => { + if (!Array.isArray(raw) || raw.length !== 3 || raw.some(axis => !Array.isArray(axis) || axis.length < 2 || axis.length > 128 || + axis.some((value: unknown, i: number) => typeof value !== 'number' || !Number.isFinite(value) || i > 0 && !(value > axis[i - 1])))) + throw new TypeError('Prepared transmission axes must increase.'); + return raw; + }; + const target = axes(targetAxes), observer = axes(observerAxes); + if (!Array.isArray(thresholds) || !thresholds.length || thresholds.length > 32 || thresholds.some((value, i) => + typeof value !== 'number' || !Number.isFinite(value) || value < 0 || i > 0 && !(value > thresholds[i - 1]))) + throw new TypeError('Prepared extinction thresholds must increase.'); + const count = [...target, ...observer].reduce((total, axis) => total * axis.length, 1); + if (count > 20_000_000) throw new TypeError('Prepared transmission bank exceeds its bounded lookup budget.'); + const tau = preparedBankColumn(bank, 'tau', 'u16', count, 'point transmission'); + const colors = preparedBankColumn(bank, 'colors', 'u8', (thresholds.length + 1) * 3 * 256, 'point transmission'); + return { frame: parseDensityVolumeFrame(bank.fields.frame), targetAxes: target, observerAxes: observer, thresholds, tau, colors }; +} diff --git a/packages/objects/src/prepared-data/cloud/cloud-points.test.ts b/packages/objects/src/prepared-data/cloud/cloud-points.test.ts index 7ee03f541ab..5990eec796e 100644 --- a/packages/objects/src/prepared-data/cloud/cloud-points.test.ts +++ b/packages/objects/src/prepared-data/cloud/cloud-points.test.ts @@ -22,6 +22,22 @@ test('cloud points travel through a bank file and read back to every billboard, assert.equal(read.positions[0], .1, 'a place keeps every digit'); }); +test('grouped compositing is opt-in prepared policy and every other value is refused', () => { + const data: PreparedCloudPoints = { ...cloud(), compositing: 'grouped' }; + assert.equal(readCloudPoints(travel(encodeCloudPoints(data))).compositing, 'grouped'); + const bank = encodeCloudPoints(cloud()); assert.equal(readCloudPoints(bank).compositing, undefined); + for (const compositing of [null, false, '', 'layered', 1]) + assert.throws(() => readCloudPoints({ ...bank, fields: { ...bank.fields, compositing } }), /compositing/u); +}); + +test('cloud points refuse additional directional cells and view selectors', () => { + const bank = encodeCloudPoints(cloud()); + for (const key of ['directional', 'views']) + assert.throws(() => readCloudPoints({ ...bank, fields: { ...bank.fields, [key]: {} } }), /one fixed atlas cell/u); + for (const key of ['backCell', 'directionalAxis', 'viewCell', 'viewDiameter', 'viewTexels']) + assert.throws(() => readCloudPoints({ ...bank, columns: { ...bank.columns, [key]: new Uint16Array(4) } }), /one fixed atlas cell/u); +}); + test('a bank that is not cloud points, or whose billboards, atlas or occluder are malformed, is refused by name', () => { const bank = encodeCloudPoints(cloud()); const fields = (patch: Record) => ({ ...bank, fields: { ...bank.fields, ...patch } }); diff --git a/packages/objects/src/prepared-data/cloud/cloud-points.ts b/packages/objects/src/prepared-data/cloud/cloud-points.ts index 133b58faca4..f04adcb5027 100644 --- a/packages/objects/src/prepared-data/cloud/cloud-points.ts +++ b/packages/objects/src/prepared-data/cloud/cloud-points.ts @@ -24,12 +24,15 @@ export interface PreparedCloudPoints { /** The atlas (a prepared file beside the bank) and the side of its square cells, in texels. */ readonly atlas: string; readonly cellTexels: number; + /** Opt-in viewport paint group, keeping moving prepared boards in 2D instead of requesting one promoted layer each. */ + readonly compositing?: 'grouped'; /** The body that hides what is behind it: none, or its ellipsoids. */ readonly occluder: readonly CloudPointEllipsoid[]; } export function encodeCloudPoints(cloud: PreparedCloudPoints): PreparedBank { - return { schema: PREPARED_CLOUD_POINTS_SCHEMA, fields: { id: cloud.id, frame: cloud.frame, count: cloud.count, atlas: cloud.atlas, cellTexels: cloud.cellTexels, occluder: cloud.occluder }, + return { schema: PREPARED_CLOUD_POINTS_SCHEMA, fields: { id: cloud.id, frame: cloud.frame, count: cloud.count, atlas: cloud.atlas, cellTexels: cloud.cellTexels, occluder: cloud.occluder, + ...(cloud.compositing ? { compositing: cloud.compositing } : {}) }, columns: { position: cloud.positions, diameter: cloud.diameters, cell: cloud.cells } }; } @@ -43,6 +46,8 @@ export function readCloudPoints(bank: PreparedBank, at = 'cloud points'): Prepar if (!Number.isSafeInteger(count) || (count as number) < 0) throw new TypeError(`${at}: count is a count, got ${JSON.stringify(count ?? null)}.`); if (typeof atlas !== 'string' || !/^[a-z0-9][a-z0-9.-]*$/u.test(atlas)) throw new TypeError(`${at}: atlas is a prepared file name, got ${JSON.stringify(atlas ?? null)}.`); if (!Number.isSafeInteger(cellTexels) || (cellTexels as number) < 1) throw new TypeError(`${at}: cellTexels is a texel count, got ${JSON.stringify(cellTexels ?? null)}.`); + const compositing = bank.fields.compositing; + if (compositing !== undefined && compositing !== 'grouped') throw new TypeError(`${at}: compositing is absent or grouped.`); const n = count as number, positions = preparedBankColumn(bank, 'position', 'f64', n * 3, at) as Float64Array; const diameters = preparedBankColumn(bank, 'diameter', 'f32', n, at) as Float32Array, cells = preparedBankColumn(bank, 'cell', 'u16', n * 2, at) as Uint16Array; if (positions.some(value => !Number.isFinite(value))) throw new TypeError(`${at}: every billboard has a finite place.`); @@ -50,5 +55,9 @@ export function readCloudPoints(bank: PreparedBank, at = 'cloud points'): Prepar if (!Array.isArray(occluder) || !occluder.every(e => e && typeof e === 'object' && vector((e as CloudPointEllipsoid).centreUnits) && Array.isArray((e as CloudPointEllipsoid).axesUnits) && (e as CloudPointEllipsoid).axesUnits.length === 3 && (e as CloudPointEllipsoid).axesUnits.every(vector))) throw new TypeError(`${at}: occluder is a list of ellipsoids, each a centre and three axes.`); - return { id, frame: parseDensityVolumeFrame(frame), count: n, positions, diameters, cells, atlas, cellTexels: cellTexels as number, occluder: occluder as CloudPointEllipsoid[] }; + if (bank.fields.directional !== undefined || bank.fields.views !== undefined || + ['backCell', 'directionalAxis', 'viewCell', 'viewDiameter', 'viewTexels'].some(key => bank.columns[key] !== undefined)) + throw new TypeError(`${at}: cloud points use one fixed atlas cell per billboard.`); + return { id, frame: parseDensityVolumeFrame(frame), count: n, positions, diameters, cells, atlas, cellTexels: cellTexels as number, occluder: occluder as CloudPointEllipsoid[], + ...(compositing ? { compositing } : {}) }; } diff --git a/packages/objects/src/prepared-data/presentation/prepared-leaf-bounds.ts b/packages/objects/src/prepared-data/presentation/prepared-leaf-bounds.ts index 7c7ac374fc1..d0819a00a16 100644 --- a/packages/objects/src/prepared-data/presentation/prepared-leaf-bounds.ts +++ b/packages/objects/src/prepared-data/presentation/prepared-leaf-bounds.ts @@ -8,6 +8,8 @@ export interface PreparedVolumeLeafStyle { readonly transform: string; readonly backgroundSize: string; readonly backgroundPosition: string; + /** A prepared front/back pair carries directional radiance on opposite faces. */ + readonly backfaceVisibility?: 'hidden'; } export function validatePreparedLeafBounds(value: unknown): void { diff --git a/packages/objects/src/volume/delivery/css-volume-types.ts b/packages/objects/src/volume/delivery/css-volume-types.ts index 9cc831b313d..ea34c553ca1 100644 --- a/packages/objects/src/volume/delivery/css-volume-types.ts +++ b/packages/objects/src/volume/delivery/css-volume-types.ts @@ -66,4 +66,6 @@ export interface PreparedCssVolume { /** Each slice image already holds its three coincident optical copies (alpha 1 - (1 - a)^3): the runtime draws one * layer per slice at opacity gain / 3 instead of three. Absent, the runtime stacks the copies itself. */ readonly mergedOpticalCopies?: 3; + /** Rigid prepared pictures in one populated stack: one image per leaf, with no optical-length or view mixing. */ + readonly fixedImages?: true; } diff --git a/packages/objects/src/volume/delivery/css-volume-validation.test.ts b/packages/objects/src/volume/delivery/css-volume-validation.test.ts index 8132b179a2b..e96c49aa3f9 100644 --- a/packages/objects/src/volume/delivery/css-volume-validation.test.ts +++ b/packages/objects/src/volume/delivery/css-volume-validation.test.ts @@ -23,6 +23,16 @@ test('accepts the direct prepared CSS volume payload and all three stacks', () = assert.equal(validatePreparedCssVolume(valid()).stacks.length, 3); }); +test('directional faces hide their backs and cannot reuse a double-sided topology', async () => { + const value = valid(); + Object.assign(value.stacks[0]!.leaves[0]!.style, { backfaceVisibility: 'hidden' }); + assert.equal(validatePreparedCssVolume(value).stacks[0]!.leaves[0]!.style.backfaceVisibility, 'hidden'); + const { samePreparedVolumeTopology } = await import('./prepared-volume-topology.js'); + assert.equal(samePreparedVolumeTopology(value, valid()), false); + Object.assign(value.stacks[0]!.leaves[0]!.style, { backfaceVisibility: 'visible' }); + assert.throws(() => validatePreparedCssVolume(value), /hide its backface/); +}); + test('rejects a runtime URL in authored leaf style', () => { const value = valid(); Object.assign(value.stacks[0]!.leaves[0]!, { style: { ...value.stacks[0]!.leaves[0]!.style, transform: 'url(/runtime.png)' } }); @@ -51,6 +61,23 @@ test('merged and unmerged copies of the same geometry are different topology', a assert.equal(samePreparedVolumeTopology({ ...valid(), mergedOpticalCopies: 3 }, { ...valid(), mergedOpticalCopies: 3 }), true); }); +test('fixed images preserve their explicit single-stack mode and reject ambiguous image policies', async () => { + const source = valid(), fixed = { ...source, fixedImages: true as const, + stacks: source.stacks.map(stack => stack.axis === 'z' ? stack : { ...stack, leaves: [] }) }; + const parsed = validatePreparedCssVolume(JSON.parse(JSON.stringify(fixed))); + assert.equal(parsed.fixedImages, true); + assert.equal(validatePreparedCssVolume(valid()).fixedImages, undefined); + for (const invalid of [false, null, 1, 'true']) assert.throws(() => validatePreparedCssVolume({ ...fixed, fixedImages: invalid }), /must be true/); + for (const incompatible of [{ mergedOpticalCopies: 3 }, { impostors: {} }, { farPlanes: {} }]) + assert.throws(() => validatePreparedCssVolume({ ...fixed, ...incompatible }), /exactly one populated stack/); + assert.throws(() => validatePreparedCssVolume({ ...source, fixedImages: true }), /exactly one populated stack/); + assert.throws(() => validatePreparedCssVolume({ ...fixed, stacks: fixed.stacks.map(stack => ({ ...stack, leaves: [] })) }), /exactly one populated stack/); + const { samePreparedVolumeTopology } = await import('./prepared-volume-topology.js'); + const { fixedImages: _, ...optical } = fixed; + assert.equal(samePreparedVolumeTopology(fixed, optical), false); + assert.equal(samePreparedVolumeTopology(fixed, parsed), true); +}); + const withFarPlanes = (): PreparedCssVolume => { const volume = valid(); return { ...volume, resources: [...volume.resources, ...['side.png', 'side-high.png'].map(path => ({ path, bytes: 2, width: 32, height: 2 }))], diff --git a/packages/objects/src/volume/delivery/css-volume-validation.ts b/packages/objects/src/volume/delivery/css-volume-validation.ts index b8238f4b9f1..3dd4e4325d3 100644 --- a/packages/objects/src/volume/delivery/css-volume-validation.ts +++ b/packages/objects/src/volume/delivery/css-volume-validation.ts @@ -21,7 +21,8 @@ export function trustPreparedCssVolume(volume: PreparedCssVolume): PreparedCssVo export function validatePreparedCssVolume(input: unknown): PreparedCssVolume { if (typeof input === 'object' && input !== null && validated.has(input)) return input as PreparedCssVolume; const value = record(input, 'prepared CSS volume'); - exactKeys(value, ['schema', 'id', 'frame', 'anchors', 'stacks', 'resources', ...['provenance', 'approximation'].filter(key => Object.hasOwn(value, key)), ...(Object.hasOwn(value, 'sky') ? ['sky'] : []), ...(Object.hasOwn(value, 'impostors') ? ['impostors'] : []), ...(Object.hasOwn(value, 'farPlanes') ? ['farPlanes'] : []), ...(Object.hasOwn(value, 'mergedOpticalCopies') ? ['mergedOpticalCopies'] : [])], 'prepared CSS volume'); + exactKeys(value, ['schema', 'id', 'frame', 'anchors', 'stacks', 'resources', ...['provenance', 'approximation'].filter(key => Object.hasOwn(value, key)), ...(Object.hasOwn(value, 'sky') ? ['sky'] : []), ...(Object.hasOwn(value, 'impostors') ? ['impostors'] : []), ...(Object.hasOwn(value, 'farPlanes') ? ['farPlanes'] : []), ...(Object.hasOwn(value, 'mergedOpticalCopies') ? ['mergedOpticalCopies'] : []), ...(Object.hasOwn(value, 'fixedImages') ? ['fixedImages'] : [])], 'prepared CSS volume'); + if (Object.hasOwn(value, 'fixedImages') && value.fixedImages !== true) throw new TypeError('Prepared CSS volume fixedImages must be true when declared.'); if (Object.hasOwn(value, 'mergedOpticalCopies') && value.mergedOpticalCopies !== 3) throw new TypeError('Prepared CSS volume merges exactly three optical copies.'); if (value.schema !== PREPARED_CSS_VOLUME_SCHEMA || typeof value.id !== 'string' || !/^[a-z][a-z0-9-]*$/u.test(value.id)) { throw new TypeError('Prepared CSS volume identity is invalid.'); @@ -44,6 +45,9 @@ export function validatePreparedCssVolume(input: unknown): PreparedCssVolume { } const leafIds = new Set(); for (const stackInput of stacks) validateStack(record(stackInput, 'volume stack'), resources, leafIds); + if (value.fixedImages === true && (stacks.filter(stack => stack.leaves.length > 0).length !== 1 || + Object.hasOwn(value, 'mergedOpticalCopies') || Object.hasOwn(value, 'impostors') || Object.hasOwn(value, 'farPlanes'))) + throw new TypeError('Fixed images need exactly one populated stack and no optical copies or alternative views.'); const normals = stacks.map((stack, index) => stack.normalUnits ?? AXES.map(axis => axis === stack.axis ? 1 : 0)); for (let i = 0; i < normals.length; i++) for (let j = 0; j < i; j++) if (Math.abs(normals[i].reduce((sum: number, value: number, k: number) => sum + value * normals[j][k], 0)) > 1e-8) @@ -68,7 +72,8 @@ export function validatePreparedCssVolume(input: unknown): PreparedCssVolume { ...(value.anchors === undefined ? {} : { anchors: value.anchors as PreparedCssVolume['anchors'] }), stacks: stacks as PreparedCssVolume['stacks'], resources: resourcesInput as PreparedCssVolume['resources'], ...(Object.hasOwn(value, 'provenance') ? { provenance: value.provenance } : {}), ...(Object.hasOwn(value, 'approximation') ? { approximation: value.approximation } : {}), - ...(farPlanes ? { farPlanes } : {}), ...(sky ? { sky } : {}), ...(impostors ? { impostors } : {}), ...(value.mergedOpticalCopies === 3 ? { mergedOpticalCopies: 3 as const } : {}) }) as PreparedCssVolume; + ...(farPlanes ? { farPlanes } : {}), ...(sky ? { sky } : {}), ...(impostors ? { impostors } : {}), ...(value.mergedOpticalCopies === 3 ? { mergedOpticalCopies: 3 as const } : {}), + ...(value.fixedImages === true ? { fixedImages: true as const } : {}) }) as PreparedCssVolume; validated.add(volume); return volume; } @@ -179,7 +184,10 @@ function validateStack(stack: Record, resources: Set, l } function validateStyle(style: Record): void { - exactKeys(style, ['width', 'height', 'transform', 'backgroundSize', 'backgroundPosition'], 'volume leaf style'); + exactKeys(style, ['width', 'height', 'transform', 'backgroundSize', 'backgroundPosition', + ...(Object.hasOwn(style, 'backfaceVisibility') ? ['backfaceVisibility'] : [])], 'volume leaf style'); + if (Object.hasOwn(style, 'backfaceVisibility') && style.backfaceVisibility !== 'hidden') + throw new TypeError('A directional volume face must hide its backface.'); if (typeof style.width !== 'string' || typeof style.height !== 'string' || typeof style.transform !== 'string' || typeof style.backgroundSize !== 'string' || typeof style.backgroundPosition !== 'string' || !dimensions(style.width, 1) || !dimensions(style.height, 1) || !matrix(style.transform) || diff --git a/packages/objects/src/volume/delivery/prepared-volume-topology.ts b/packages/objects/src/volume/delivery/prepared-volume-topology.ts index 19179fe7ff5..7bffc094066 100644 --- a/packages/objects/src/volume/delivery/prepared-volume-topology.ts +++ b/packages/objects/src/volume/delivery/prepared-volume-topology.ts @@ -7,7 +7,7 @@ export function samePreparedVolumeTopology(leftInput: PreparedCssVolume, rightIn const left = validatePreparedCssVolume(leftInput), right = validatePreparedCssVolume(rightInput); if (!frameEquals(left.frame, right.frame) || !anchorsEqual(left.anchors, right.anchors)) return false; // Merged copies retain one node a slice where unmerged ones retain three: the encodings are different DOM. - if (left.mergedOpticalCopies !== right.mergedOpticalCopies) return false; + if (left.mergedOpticalCopies !== right.mergedOpticalCopies || left.fixedImages !== right.fixedImages) return false; for (const axis of AXES) { const a = left.stacks.find(stack => stack.axis === axis), b = right.stacks.find(stack => stack.axis === axis); if (!a || !b || !vectorEquals(a.normalUnits, b.normalUnits) || a.leaves.length !== b.leaves.length) return false; @@ -15,7 +15,7 @@ export function samePreparedVolumeTopology(leftInput: PreparedCssVolume, rightIn const x = a.leaves[index]!, y = b.leaves[index]!, prepared = x.style, other = y.style; if (x.id !== y.id || x.widthPx !== y.widthPx || x.heightPx !== y.heightPx || !vectorEquals(x.centerUnits, y.centerUnits) || prepared.width !== other.width || prepared.height !== other.height || - prepared.transform !== other.transform || !boundsEqual(x.boundsCssPixels, y.boundsCssPixels)) return false; + prepared.transform !== other.transform || prepared.backfaceVisibility !== other.backfaceVisibility || !boundsEqual(x.boundsCssPixels, y.boundsCssPixels)) return false; } } const far = left.farPlanes, otherFar = right.farPlanes; @@ -29,9 +29,7 @@ export function samePreparedVolumeTopology(leftInput: PreparedCssVolume, rightIn if (xs.length !== ys.length) return false; for (const [index, x] of xs.entries()) { const y = ys[index]!; - if (x.id !== y.id || x.widthPx !== y.widthPx || x.heightPx !== y.heightPx || !vectorEquals(x.centerUnits, y.centerUnits) || - x.style.width !== y.style.width || x.style.height !== y.style.height || x.style.transform !== y.style.transform || - !boundsEqual(x.boundsCssPixels, y.boundsCssPixels)) return false; + if (!leafGeometryEquals(x, y)) return false; } } } @@ -67,6 +65,6 @@ function boundsEqual(left: { min: readonly number[]; max: readonly number[] } | function leafGeometryEquals(x: PreparedVolumeLeaf, y: PreparedVolumeLeaf): boolean { return x.id === y.id && x.widthPx === y.widthPx && x.heightPx === y.heightPx && vectorEquals(x.centerUnits, y.centerUnits) && - x.style.width === y.style.width && x.style.height === y.style.height && x.style.transform === y.style.transform && + x.style.width === y.style.width && x.style.height === y.style.height && x.style.transform === y.style.transform && x.style.backfaceVisibility === y.style.backfaceVisibility && boundsEqual(x.boundsCssPixels, y.boundsCssPixels); } diff --git a/packages/renderer/src/prepared-data/readers.ts b/packages/renderer/src/prepared-data/readers.ts index 0118788d146..b256b9776ba 100644 --- a/packages/renderer/src/prepared-data/readers.ts +++ b/packages/renderer/src/prepared-data/readers.ts @@ -4,10 +4,11 @@ import { cataloguePointsReader } from '../universe/points/catalogue-point-reader import { catalogueDotsReader } from '../universe/points/catalogue-dots-reader.js'; import { galaxyStationsReader, galaxyStationSceneReader, galaxyStationCloudsReader } from '../universe/galaxy-stations/galaxy-station-reader.js'; import { cloudOverlayReader } from '../universe/clouds/cloud-overlay-reader.js'; +import { pointTransmissionReader } from '../universe/points/point-transmission-reader.js'; /** The reader of every prepared format, by the kind of file it reads. A new format adds its reader here. */ const READERS: ReadonlyMap = new Map( - ([cssVolumeReader, volumeStarsReader, cataloguePointsReader, catalogueDotsReader, cloudOverlayReader, galaxyStationsReader, galaxyStationSceneReader, galaxyStationCloudsReader] as readonly PreparedReaderDefinition[]).map(reader => [reader.kind, reader] as const)); + ([cssVolumeReader, volumeStarsReader, cataloguePointsReader, catalogueDotsReader, cloudOverlayReader, galaxyStationsReader, galaxyStationSceneReader, galaxyStationCloudsReader, pointTransmissionReader] as readonly PreparedReaderDefinition[]).map(reader => [reader.kind, reader] as const)); /** Read `url` with the reader of `kind`, on this thread: the data worker in a browser, the caller's own in Node. */ export function readPreparedHere(kind: string, url: string, fetcher: typeof fetch = fetch): Promise { diff --git a/packages/renderer/src/sky/prepared-sky-runtime.test.ts b/packages/renderer/src/sky/prepared-sky-runtime.test.ts index e36f2205edf..587fe386e8c 100644 --- a/packages/renderer/src/sky/prepared-sky-runtime.test.ts +++ b/packages/renderer/src/sky/prepared-sky-runtime.test.ts @@ -272,7 +272,7 @@ for (const { withSky } of [{ withSky: true }, { withSky: false }]) test(`nearer // went black at 14.3 kpc edge-on (volume.css). const volumeRules = [...readFileSync(new URL('../styles/volume.css', import.meta.url), 'utf8').replace(/\/\*[\s\S]*?\*\//gu, '') .matchAll(/([^{}]+)\{([^}]*)\}/gu)].map(([, selector, body]) => ({ selector: selector!.trim().replace(/\s+/gu, ' '), body: body! })); - assert.ok(volumeRules.some(rule => rule.selector === '.prepared-volume-image > .css-volume-projection' && /(^|;)\s*overflow:\s*hidden\s*(;|$)/u.test(rule.body)), + assert.ok(volumeRules.some(rule => rule.selector.split(',').some(selector => selector.trim() === '.prepared-volume-image > .css-volume-projection') && /(^|;)\s*overflow:\s*hidden\s*(;|$)/u.test(rule.body)), 'the image layer clips each stack projection'); for (const projection of volumeImage.children.filter(node => node.className === 'css-volume-projection')) { assert.equal(projection.parentNode?.className, 'prepared-volume-image'); diff --git a/packages/renderer/src/styles/volume-clip.test.mts b/packages/renderer/src/styles/volume-clip.test.mts new file mode 100644 index 00000000000..dc7731e88a8 --- /dev/null +++ b/packages/renderer/src/styles/volume-clip.test.mts @@ -0,0 +1,26 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import test from 'node:test'; +import { chromium } from 'playwright'; + +test('image and dataset volume projections clip oversized painted children at their own viewport', async () => { + const css = await readFile(new URL('./volume.css', import.meta.url), 'utf8'); + const browser = await chromium.launch({ headless: true }); + try { + const page = await browser.newPage({ viewport: { width: 400, height: 300 } }); + await page.setContent(` +
+
+
+
+
+
`); + const actual = await page.evaluate(() => ({ + inside: [document.elementFromPoint(20, 30)?.id, document.elementFromPoint(20, 130)?.id], + outside: [document.elementFromPoint(140, 30)?.id, document.elementFromPoint(140, 130)?.id], + })); + assert.deepEqual(actual.inside, ['image-child', 'dataset-child']); + assert(!actual.outside.includes('image-child'), 'Image plane escaped its projection viewport'); + assert(!actual.outside.includes('dataset-child'), 'Dataset plane escaped its projection viewport'); + } finally { await browser.close(); } +}); diff --git a/packages/renderer/src/styles/volume.css b/packages/renderer/src/styles/volume.css index 8a6ab5647c2..7ab8dd27617 100644 --- a/packages/renderer/src/styles/volume.css +++ b/packages/renderer/src/styles/volume.css @@ -55,7 +55,8 @@ /* A galaxy stack mixed by root opacity is flattened into one surface. With the eye inside the stack, the sheet next to it projects ~250,000 px wide and Chromium drops the whole surface: the galaxy went black at 14.3 kpc edge-on and came back at 13.8 kpc (2026-10-18). Clipping the surface to the viewport keeps it paintable. */ -.prepared-volume-image > .css-volume-projection { overflow: hidden; } +.prepared-volume-image > .css-volume-projection, +.prepared-volume-dataset-cloud > .css-volume-projection { overflow: hidden; } /* Image-layer banks and image meshes are transparent projections whose camera-driven scene composites once, so slice and patch rasters keep their scale through rotation. */ diff --git a/packages/renderer/src/universe/clouds/cloud-overlay-reader.test.ts b/packages/renderer/src/universe/clouds/cloud-overlay-reader.test.ts new file mode 100644 index 00000000000..69efeb0e454 --- /dev/null +++ b/packages/renderer/src/universe/clouds/cloud-overlay-reader.test.ts @@ -0,0 +1,28 @@ +import { test, mock } from 'node:test'; +import assert from 'node:assert/strict'; +import { encodeCloudPoints, type PreparedBank, type PreparedCloudPoints } from '@cssearth/objects'; + +let fixture: PreparedBank | undefined; +mock.module('../../prepared-data/prepared-readers.js', { namedExports: { + fetchPreparedBank: async () => { if (!fixture) throw new Error('No fixture.'); return fixture; }, + preparedReader: (kind: string, read: unknown) => ({ kind, read }), +} }); +const { cloudOverlayReader } = await import('./cloud-overlay-reader.js'); + +test('the worker transfers each fixed cloud column buffer once, whether separate or shared', async () => { + const cloud: PreparedCloudPoints = { id: 'dust', count: 1, + frame: { referenceFrame: 'fixture', epochJdTt: 1, originM: [0, 0, 0], localToReferenceXyzw: [0, 0, 0, 1], metersPerUnit: 1, + boundsUnits: { min: [-1, -1, -1], max: [1, 1, 1] } }, + positions: Float64Array.from([0, 0, 0]), diameters: Float32Array.from([1]), cells: Uint16Array.from([0, 0]), + atlas: 'dust.webp', cellTexels: 32, occluder: [] }; + for (const data of [cloud, { ...cloud, cells: new Uint16Array(cloud.diameters.buffer) }]) { + fixture = encodeCloudPoints(data); + const reading = await cloudOverlayReader.read('/dust.bin', fetch); + assert.equal(reading.value.kind, 'points'); + if (reading.value.kind !== 'points') throw new Error('Not points.'); + assert.deepEqual(reading.value.points.cells, data.cells); + const expected = new Set([data.positions.buffer, data.diameters.buffer, data.cells.buffer]); + assert.deepEqual(new Set(reading.transfer), expected); + assert.equal(reading.transfer.length, expected.size, 'each shared buffer is transferred once'); + } +}); diff --git a/packages/renderer/src/universe/clouds/cloud-overlay-reader.ts b/packages/renderer/src/universe/clouds/cloud-overlay-reader.ts index d7e92df024b..f034e864234 100644 --- a/packages/renderer/src/universe/clouds/cloud-overlay-reader.ts +++ b/packages/renderer/src/universe/clouds/cloud-overlay-reader.ts @@ -15,6 +15,7 @@ export const cloudOverlayReader = preparedReader('cloud-overla // an occluder dims what is behind it only if its axes span space: a flat or zero axis has no inside (cloud-occluder.ts) const occluder = value.kind === 'points' ? value.points.occluder : value.lines.occluder; if (!occluder.every(e => basisSpansSpace(e.axesUnits))) throw new TypeError(`${url}: every occluder's axes span space.`); - const columns = value.kind === 'points' ? [value.points.positions, value.points.diameters, value.points.cells] : [value.lines.from, value.lines.to, value.lines.rgba, value.lines.heads]; + const columns = value.kind === 'points' ? [value.points.positions, value.points.diameters, value.points.cells] + : [value.lines.from, value.lines.to, value.lines.rgba, value.lines.heads]; return { value, transfer: [...new Set(columns.map(column => column.buffer as ArrayBuffer))] }; }); diff --git a/packages/renderer/src/universe/clouds/cloud-points.test.ts b/packages/renderer/src/universe/clouds/cloud-points.test.ts index c7f2e564523..1b8230c8001 100644 --- a/packages/renderer/src/universe/clouds/cloud-points.test.ts +++ b/packages/renderer/src/universe/clouds/cloud-points.test.ts @@ -78,6 +78,37 @@ test('billboards are built off the page, placed by transform and opacity only, d assert.deepEqual(order(layer.root), ['0', '1']); }); +const frameOrder = (root: HTMLElement) => [...root.children].map(board => { + const node = board as HTMLElement; return `${node.dataset.cloudCluster}:${node.dataset.cloudFrame}`; +}); +const orbitAt = (degree: number) => { + const a = degree * Math.PI / 180; + return { ...at(10), world: { ...at(10).world, pose: { positionM: [10 * Math.sin(a), 0, 10 * Math.cos(a)] as const, + orientationXyzw: [0, Math.sin(a / 2), 0, Math.cos(a / 2)] as const } } }; +}; +test('grouped compositing requests one static paint group and 2D boards with unchanged geometry, alpha and order', () => { + const { host } = page(), ordinary = createCloudPoints({ host, cloud, resolveResource }); + const grouped = createCloudPoints({ host, cloud: { ...cloud, compositing: 'grouped' }, resolveResource }); + assert.equal(grouped.root.style.willChange, 'transform'); assert.equal(grouped.root.style.transform, 'translateZ(0)'); + assert.equal(grouped.root.style.contain, 'paint'); assert.equal(grouped.root.style.overflow, 'hidden'); + assert.ok(!ordinary.root.style.willChange && !ordinary.root.style.transform && !ordinary.root.style.contain); + const groupedNodes = [...grouped.root.children] as HTMLElement[], ordinaryNodes = [...ordinary.root.children] as HTMLElement[]; + groupedNodes.forEach((node, i) => { assert.ok(!node.style.willChange); assert.equal(ordinaryNodes[i]!.style.willChange, 'transform,opacity'); + assert.equal(node.style.width, ordinaryNodes[i]!.style.width); assert.equal(node.style.background, ordinaryNodes[i]!.style.background); }); + const writes = recordWrites(grouped.root), initial = [...grouped.root.children]; + for (const degree of [0, 45, 90, 180, 270]) { + ordinary.place(orbitAt(degree)); grouped.place(orbitAt(degree)); + groupedNodes.forEach((node, i) => { assert.match(node.style.transform, /^translate\(/u); assert.match(ordinaryNodes[i]!.style.transform, /^translate3d\(/u); + assert.equal(node.style.transform, ordinaryNodes[i]!.style.transform.replace('translate3d(', 'translate(').replace(',0) scale', ') scale')); + assert.equal(node.style.opacity, ordinaryNodes[i]!.style.opacity); }); + assert.ok(initial.every((node, i) => grouped.root.children[i] === node)); + } + assert.deepEqual([...new Set(writes)].sort(), ['opacity', 'transform']); + writes.length = 0; grouped.place(orbitAt(270)); assert.deepEqual(writes, []); + ordinary.atRest!(); grouped.atRest!(); assert.deepEqual(frameOrder(grouped.root), frameOrder(ordinary.root)); + assert.equal(grouped.root.style.transform, 'translateZ(0)', 'the paint-group transform remains static'); +}); + /** A page whose fetch answers each address with a bank, or fails while `failing` says so. */ function fetching(banks: Record, delayTurns = 0) { const { window, host } = page(), asked: string[] = []; @@ -190,6 +221,39 @@ test('an overlay taken away before its bank arrives never mounts', async t => { assert.equal(host.children.length, 0); }); +test('cloud frame and epoch mismatches fail before any publication writes', () => { + const { host } = page(), layer = createCloudPoints({ host, cloud, resolveResource }), writes = recordWrites(layer.root); + const publication = at(10); + for (const world of [{ ...publication.world, referenceFrame: 'other' }, { ...publication.world, epochJdTt: 2 }]) + assert.throws(() => layer.place({ ...publication, world }), /different reference frames/u); + assert.deepEqual(writes, []); +}); + +test('construction errors use the same bounded retry path as failed reads', async t => { + const settle = mocked(t), warned = t.mock.method(console, 'warn', () => {}); + const { host, asked } = fetching({ '/points.bin': encodeCloudPoints(cloud) }); + const overlay = mountCloudOverlay({ host, url: '/points.bin', resolveResource() { throw new Error('unavailable atlas'); } }); + for (let attempt = 0; attempt < 4; attempt++) { + if (attempt) t.mock.timers.tick(2000 * 2 ** (attempt - 1)); + overlay.publish(at(10), 1); await settle(); + assert.deepEqual([asked.length, warned.mock.callCount(), host.children.length], [attempt + 1, attempt + 1, 0]); + for (let frame = 0; frame < 20; frame++) overlay.publish(at(10), 1); + assert.equal(asked.length, attempt + 1, 'failed construction does not re-fetch every frame'); + } + t.mock.timers.tick(60_000); overlay.publish(at(10), 1); await settle(); + assert.equal(asked.length, 4); overlay.destroy(); +}); + +test('an overlay in the wrong frame is rejected before attachment and uses retry backoff', async t => { + const settle = mocked(t), warned = t.mock.method(console, 'warn', () => {}); + const { host, asked } = fetching({ '/points.bin': encodeCloudPoints({ ...cloud, frame: { ...cloud.frame, epochJdTt: 2 } }) }); + const overlay = mountCloudOverlay({ host, url: '/points.bin', resolveResource }); + overlay.publish(at(10), 1); await settle(); + assert.deepEqual([asked.length, warned.mock.callCount(), host.children.length], [1, 1, 0]); + assert.match(String(warned.mock.calls[0]!.arguments[1]), /different reference frames/u); + overlay.publish(at(10), 1); await settle(); assert.equal(asked.length, 1); overlay.destroy(); +}); + test('a failed read is tried again on a later publication, waiting twice as long each time, at most four times', async t => { const settleRead = mocked(t); const warned = t.mock.method(console, 'warn', () => {}); diff --git a/packages/renderer/src/universe/clouds/cloud-points.ts b/packages/renderer/src/universe/clouds/cloud-points.ts index bdcd1956841..b99a094ebdd 100644 --- a/packages/renderer/src/universe/clouds/cloud-points.ts +++ b/packages/renderer/src/universe/clouds/cloud-points.ts @@ -34,12 +34,17 @@ export function mountCloudOverlay({ host, before, url, resolveResource }: { host read().then(data => { loading = false; if (destroyed) return; + const frame = data.kind === 'points' ? data.points.frame : data.lines.frame, world = latest?.publication.world; + if (world && (frame.referenceFrame !== world.referenceFrame || frame.epochJdTt !== world.epochJdTt)) + throw new TypeError('Prepared cloud and world camera use different reference frames.'); layer = data.kind === 'points' ? createCloudPoints({ host, cloud: data.points, resolveResource }) : createCloudSegments({ host, lines: data.lines }); rootStyle = retainedStyle(layer.root); apply(); - }, (error: unknown) => { + }).catch((error: unknown) => { + if (destroyed) return; + layer?.root.remove(); layer = null; rootStyle = null; attached = false; loading = false; failures++; retryAt = Date.now() + RETRY_MS * 2 ** (failures - 1); - console.warn(`Overlay ${url} could not be read (attempt ${failures} of ${RETRIES}).`, error); + console.warn(`Overlay ${url} could not be installed (attempt ${failures} of ${RETRIES}).`, error); }); } function settle() { @@ -77,41 +82,51 @@ export function mountCloudOverlay({ host, before, url, resolveResource }: { host } /** - * Cloud points (@cssearth/objects cloud-points.ts) as billboards: one element a cluster, its atlas cell (a prepared file + * Cloud points (@cssearth/objects cloud-points.ts) as billboards: one fixed atlas cell per cluster. + * No light is calculated at runtime. Its atlas cell (a prepared file * found through `resolveResource`, as every published asset has its own address) as its background, placed each * publication at its centre's place on screen, as wide as its cluster at that distance, and dimmed by how deep its sight * line passes through the occluder's ellipsoids. Placing writes only transform and opacity, and only when they change; * the order, far to near, is set once the camera rests (`atRest`). */ export function createCloudPoints({ host, cloud, resolveResource }: { host: HTMLElement; cloud: PreparedCloudPoints; resolveResource(path: string): string }): CloudOverlayLayer { - const doc = host.ownerDocument, depthThrough = occluderDepth(cloud.occluder), cell = cloud.cellTexels; + const doc = host.ownerDocument, depthThrough = occluderDepth(cloud.occluder), cell = cloud.cellTexels, grouped = cloud.compositing === 'grouped'; const root = doc.createElement('div'); root.className = 'prepared-cloud-points'; root.setAttribute('aria-hidden', 'true'); root.style.cssText = 'position:absolute;inset:0;overflow:hidden;pointer-events:none'; + if (grouped) { root.style.willChange = 'transform'; root.style.transform = 'translateZ(0)'; root.style.contain = 'paint'; } root.dataset.cloudPoints = String(cloud.count); + root.dataset.cloudFrames = '1'; const atlas = resolveResource(cloud.atlas); let order = ''; const boards = Array.from({ length: cloud.count }, (_, index) => { - const el = doc.createElement('div'); - el.style.cssText = `position:absolute;left:0;top:0;width:${cell}px;height:${cell}px;background:url("${atlas}") -${cloud.cells[index * 2]}px -${cloud.cells[index * 2 + 1]}px no-repeat;transform-origin:50% 50%;will-change:transform,opacity`; - root.append(el); return { el, style: retainedStyle(el), index, depth: 0 }; + const el = doc.createElement('div'), offset = index * 2; + el.style.cssText = `position:absolute;left:0;top:0;width:${cell}px;height:${cell}px;background:url("${atlas}") -${cloud.cells[offset]}px -${cloud.cells[offset + 1]}px no-repeat;transform-origin:50% 50%;${grouped ? '' : 'will-change:transform,opacity'}`; + el.dataset.cloudCluster = String(index); el.dataset.cloudFrame = 'forward'; + root.append(el); return { el, style: retainedStyle(el), index, key: `${index}:forward`, depth: 0 }; }); return { root, place(publication) { + if (publication.world.referenceFrame !== cloud.frame.referenceFrame || publication.world.epochJdTt !== cloud.frame.epochJdTt) + throw new TypeError('Prepared cloud and world camera use different reference frames.'); const local = presentPhysicalPoseInVolume(publication.world.pose, cloud.frame), r = cssCameraAxesFromOrientation(local.orientationXyzw); const [px, py, pz] = local.positionUnits, focal = publication.viewport.focalPixels, [ox, oy] = publication.viewport.principalOffsetPixels; const w = (publication.viewport.widthPixels ?? host.clientWidth) / 2, h = (publication.viewport.heightPixels ?? host.clientHeight) / 2; for (const board of boards) { - const i = board.index, x = cloud.positions[i * 3]! - px, y = cloud.positions[i * 3 + 1]! - py, z = cloud.positions[i * 3 + 2]! - pz; - const depth = -(r[2] * x + r[5] * y + r[8] * z); board.depth = depth; + const i = board.index; + const x = cloud.positions[i * 3]! - px, y = cloud.positions[i * 3 + 1]! - py, z = cloud.positions[i * 3 + 2]! - pz; + const depth = -(r[2] * x + r[5] * y + r[8] * z); + board.depth = depth; if (depth <= 0) { board.style.opacity('0'); continue; } const sx = focal * (r[0] * x + r[3] * y + r[6] * z) / depth + ox + w, sy = focal * (r[1] * x + r[4] * y + r[7] * z) / depth + oy + h; - board.style.transform(`translate3d(${(sx - cell / 2).toFixed(1)}px,${(sy - cell / 2).toFixed(1)}px,0) scale(${(cloud.diameters[i]! * focal / depth / cell).toFixed(4)})`); - board.style.opacity((1 - (1 - OCCLUDED_FLOOR) * depthThrough(px, py, pz, x, y, z)).toFixed(3)); + const transform = `${grouped ? 'translate' : 'translate3d'}(${(sx - cell / 2).toFixed(1)}px,${(sy - cell / 2).toFixed(1)}px${grouped ? '' : ',0'}) scale(${(cloud.diameters[i]! * focal / depth / cell).toFixed(4)})`; + const occlusion = 1 - (1 - OCCLUDED_FLOOR) * depthThrough(px, py, pz, x, y, z); + board.style.transform(transform); + board.style.opacity(occlusion.toFixed(3)); } }, atRest() { - const sorted = [...boards].sort((a, b) => b.depth - a.depth), key = sorted.map(board => board.index).join(); + const sorted = [...boards].sort((a, b) => b.depth - a.depth || a.index - b.index), key = sorted.map(board => board.key).join(); if (key !== order) { order = key; for (const board of sorted) root.append(board.el); } }, }; diff --git a/packages/renderer/src/universe/clouds/dataset-cloud-overlays.ts b/packages/renderer/src/universe/clouds/dataset-cloud-overlays.ts new file mode 100644 index 00000000000..ef4d87357a8 --- /dev/null +++ b/packages/renderer/src/universe/clouds/dataset-cloud-overlays.ts @@ -0,0 +1,34 @@ +import type { VolumeCameraPublication } from '../../volume/types.js'; +import { mountCloudOverlay } from './cloud-points.js'; + +/** The existing cloud renderer, selected with a volume bank's actual displayed dataset. Retired clouds retain their + * coast signal until it stops, so dataset changes never remove resident DOM during inertia. This owns no rendering. */ +export function createDatasetCloudOverlays({ host, before, urls, resolveResource }: { + host: HTMLElement; before: Node; urls: Readonly>; resolveResource(path: string): string; +}) { + let selected: string | null = null, coasting = false; + let layers: ReturnType[] = [], retiring: ReturnType[] = []; + return { + publish(dataset: string, publication: VolumeCameraPublication, opacity: number) { + if (dataset !== selected) { + for (const layer of layers) { layer.retire(); if (coasting) retiring.push(layer); } + selected = dataset; + layers = (Object.hasOwn(urls, dataset) ? urls[dataset]! : []).map(url => { + const layer = mountCloudOverlay({ host, before, url, resolveResource }); + layer.setCoasting(coasting); + return layer; + }); + } + for (const layer of layers) layer.publish(publication, opacity); + }, + setCoasting(active: boolean) { + coasting = active; + for (const layer of [...layers, ...retiring]) layer.setCoasting(active); + if (!active) retiring = []; + }, + destroy() { + for (const layer of [...layers, ...retiring]) layer.destroy(); + layers = []; retiring = []; selected = null; + }, + }; +} diff --git a/packages/renderer/src/universe/points/batched-spatial-points.test.ts b/packages/renderer/src/universe/points/batched-spatial-points.test.ts index fd6c3ef699f..fa9d2685c70 100644 --- a/packages/renderer/src/universe/points/batched-spatial-points.test.ts +++ b/packages/renderer/src/universe/points/batched-spatial-points.test.ts @@ -7,6 +7,23 @@ import { parseHTML } from 'linkedom'; import { mountBatchedSpatialPoints, pointPaint } from './batched-spatial-points.js'; import { reservePointLayer } from './point-layer.js'; import { DOT_SLOTS } from './point-paths.js'; +import { setPointTransmission } from './prepared-transmission.js'; +import { parsePointTransmission, PREPARED_POINT_TRANSMISSION_SCHEMA } from '@cssearth/objects'; + +test('a dust palette arriving during travel never freezes point projection or joins paths mid-motion',async()=>{ + const {document}=parseHTML('
'),host=document.getElementById('host')!; + const frame={referenceFrame:'sun-icrf',epochJdTt:2451545,originM:[0,0,0] as const,localToReferenceXyzw:[0,0,0,1] as const,metersPerUnit:1,boundsUnits:{min:[-20,-20,-20] as const,max:[20,20,20] as const}}; + const field=mountBatchedSpatialPoints({host,frame,points:[{positionUnits:[1,0,-10] as const}],className:'test-points',stylePoint:()=>({colorCss:'#ffffff',opacity:1,radiusPx:1}),paintPalette:['#ffffffff@1']}); + const viewport={focalPixels:100,principalOffsetPixels:[0,0] as const,widthPixels:1000,heightPixels:800}; + const at=(x:number)=>({world:{referenceFrame:frame.referenceFrame,epochJdTt:frame.epochJdTt,pose:{positionM:[x,0,0] as const,orientationXyzw:[0,0,0,1] as const}},viewport}); + field.publish(at(0));const path=field.root.querySelector('path')!,before=path.getAttribute('d'),owner={}; + const colors=new Uint8Array(1536);for(let level=0;level<2;level++)for(let band=0;band<3;band++)for(let value=0;value<256;value++)colors[(level*3+band)*256+value]=level?Math.round(value/(band+2)):value; + setPointTransmission(host,owner,parsePointTransmission({schema:PREPARED_POINT_TRANSMISSION_SCHEMA,fields:{frame,targetAxes:[[-20,20],[-20,20],[-20,20]],observerAxes:[[-20,20],[-20,20],[-20,20]],thresholds:[.5]},columns:{tau:new Uint16Array(64).fill(1000),colors}})); + field.publish(at(1));assert.notEqual(path.getAttribute('d'),before,'motion continues while material waits');assert.equal(field.root.querySelectorAll('path').length,1); + await new Promise(resolve=>setTimeout(resolve,200));assert.equal(field.root.querySelectorAll('path').length,3);assert.equal(field.root.getAttribute('data-point-transmission'),'prepared'); + assert(field.root.querySelector('[stroke="#805540ff"]')?.getAttribute('d')); + field.publish(at(2));assert.equal(field.root.querySelectorAll('path').length,3);setPointTransmission(host,owner,null);field.destroy(); +}); test('a spatial point field reprojects through one retained SVG path per paint color', () => { const {document}=parseHTML('
'),host=document.getElementById('host')!,before=host.firstElementChild!; diff --git a/packages/renderer/src/universe/points/batched-spatial-points.ts b/packages/renderer/src/universe/points/batched-spatial-points.ts index b80287d2786..544b562259c 100644 --- a/packages/renderer/src/universe/points/batched-spatial-points.ts +++ b/packages/renderer/src/universe/points/batched-spatial-points.ts @@ -1,5 +1,6 @@ import { presentPhysicalPoseInVolume, cssCameraAxesFromOrientation } from '@cssearth/engine'; -import { type DensityVolumeFrame, type VolumeVector } from '@cssearth/objects'; +import { type DensityVolumeFrame, type VolumeVector, type PreparedPointTransmission } from '@cssearth/objects'; +import { pointTransmissionAt, transmissionPaints, transmissionLookup } from './prepared-transmission.js'; import type { VolumeCameraPublication } from '../../volume/types.js'; import { DOT_SLOTS, SPLIT_POINTS, mountPointPaths, type PointPaintSlots } from './point-paths.js'; @@ -186,6 +187,7 @@ export function mountBatchedSpatialPoints(options // The dots of the last paint of each slot, in the view and drawn: a paint of some slots recounts only those. const visibleOf = new Int32Array(DOT_SLOTS), candidatesOf = new Int32Array(DOT_SLOTS); const part = { points, cells, drawnCount, keepFraction, hidden, paint, positions, paths, occludedPaths, margins, ranks, slotOf, visibleOf, candidatesOf, cellCount, cellStart, order, + transmission: null as PreparedPointTransmission | null, transmissionPaths: [] as Int32Array[], boxes: cells?.boxes ?? new Float64Array(6), widestMargin: 0, culled: new Int32Array(cellCount), ready: false, /** Resolve up to `limit` more of the part's points, in order; the last slice orders them by cell and readies the part. * A whole number of them, and one or more: the pacer's budget is halved after a slow frame, and half a point left @@ -226,7 +228,7 @@ export function mountBatchedSpatialPoints(options if (!deferFill) part.resolve(Infinity); return part; }); - const residentElements = 1 + [...paints.values()].reduce((sum, paint) => sum + paint.residentElements, 0); + let residentElements = 1 + [...paints.values()].reduce((sum, paint) => sum + paint.residentElements, 0); // The last full paint: the camera's position and everything else it depended on, how many points each part drew and // the nearest of them. A camera that only moved (a zoom, a pan around a planet) moves no point by a visible amount while // its translation is far below that nearest distance, so the paint is kept (parallaxPixels). @@ -292,6 +294,42 @@ export function mountBatchedSpatialPoints(options latest = publication; if(world.referenceFrame !== frame.referenceFrame || world.epochJdTt !== frame.epochJdTt) throw new TypeError('Point camera frame mismatch'); const local = presentPhysicalPoseInVolume(world.pose,frame), r = cssCameraAxesFromOrientation(local.orientationXyzw); + const wantedField = pointTransmissionAt('layer' in host ? host.layer.root : host); + const materialPending = parts.some(part => part.ready && part.transmission !== wantedField) && Boolean(painted) && !exact; + // Keep projecting through the resident material while a new palette waits for the settled paint. + const field = materialPending ? parts.find(part => part.ready)?.transmission ?? null : wantedField; + const changed = !materialPending && parts.some(part => part.ready && part.transmission !== field); + if (materialPending) { owed = true;settleAfterPause(); } + if (changed) for (const [partIndex, part] of parts.entries()) { + if (!part.ready || part.transmission === field) continue; + part.transmission = field;part.transmissionPaths = []; + if (!field) continue; + const { styles, styleOf } = columns[partIndex]!; + const byStyle = new Map(); + for (let index = 0; index < part.points.length; index++) { + const original = part.paths[index]!;if (original < 0) continue; + const styleIndex = styleOf ? styleOf[index]! : 0; + let variants = byStyle.get(styleIndex); + if (!variants) { + const style = styles[styleIndex]!; + if (!style) continue; + variants = transmissionPaints(field, pointPaint(style)).map((paint, level) => { + const key = `${paint}|transmission-${styleIndex}-${level}`; + part.paint.prepare(key, original);return part.paint.entry(key, style.radiusPx); + }); + byStyle.set(styleIndex, variants); + } + variants.forEach((path, level) => { + part.transmissionPaths[level] ??= new Int32Array(part.points.length); + part.transmissionPaths[level]![index] = part.paint.split(path) ? path + part.slotOf[index]! : path; + }); + } + } + if (changed) { + residentElements = 1 + [...paints.values()].reduce((sum, paint) => sum + paint.residentElements, 0); + root.setAttribute('data-point-transmission', field ? 'prepared' : 'none'); + } + const extinction = field && parts.some(part => part.transmission === field) ? transmissionLookup(field, world, frame) : null; const keeps = parts.map(part => part.keepFraction ? Math.max(0, Math.min(1, part.keepFraction())) : 1); const hiddens = parts.map(part => part.hidden ? part.hidden() : null); // The camera's turn and lens; the kept shares are part of the paint too (`same` below): a new share repaints at rest. @@ -314,9 +352,9 @@ export function mountBatchedSpatialPoints(options unchanged = still && same && !turned; // A paint without its margin is kept like any other; only the pause's exact paint replaces it. The slots a paint // left behind follow through the pacer. - if (held && still && same && !turned && !(exact && painted.overscan < OVERSCAN) && units === null) { + if (!changed && held && still && same && !turned && !(exact && painted.overscan < OVERSCAN) && units === null) { if (behind > 0) { arriving = true; arrivals.request(true); } - layer.unwarp(); owed = false; return; + layer.unwarp(); owed = materialPending; return; } // The camera moved (or the paint changed) since the pause's pass began: what it completes is no longer at rest. if (units === null && forced === null) resting = false; @@ -338,8 +376,8 @@ export function mountBatchedSpatialPoints(options // slow zoom the margin was a third of the dots written; without it 690 frames had 19 to 24 over 20 ms at the nearby // universe against 57 to 81, and 42 to 47 at the Milky Way against 105 to 121 (interleaved runs, 2026-10-03). const overscan = travelling && !coherent ? 0 : OVERSCAN; - owed = false; written = 0; - if (travelling) settleAfterPause(); else if (settle !== null) { clearTimeout(settle); settle = null; } + owed = materialPending; written = 0; + if (travelling || materialPending) settleAfterPause(); else if (settle !== null) { clearTimeout(settle); settle = null; } let nearestSquared = Infinity; const [px, py, pz] = local.positionUnits, focal = viewport.focalPixels, [ox, oy] = viewport.principalOffsetPixels; const halfWidth = (viewport.widthPixels ?? Infinity) / 2, halfHeight = (viewport.heightPixels ?? Infinity) / 2; @@ -427,6 +465,10 @@ export function mountBatchedSpatialPoints(options if (inView) candidatesOf[slot]!++; if (keep < 1 && ranks[index]! >= keep) continue; let target = path; + if (extinction && part.transmission === field) { + const level = extinction([positions[o]!, positions[o + 1]!, positions[o + 2]!]); + target = part.transmissionPaths[level]?.[index] ?? path; + } if (occluder) { const along = onx * x + ony * y + onz * z, t = along === 0 ? -1 : side / along; if (t > 0 && t < 1) { diff --git a/packages/renderer/src/universe/points/point-paths.ts b/packages/renderer/src/universe/points/point-paths.ts index f526c618d4f..195bc6cb22c 100644 --- a/packages/renderer/src/universe/points/point-paths.ts +++ b/packages/renderer/src/universe/points/point-paths.ts @@ -50,8 +50,9 @@ export function mountPointPaths(host: SVGElement, palette: readonly string[], sl // offset from it. `dots` is how many dots a path held when it was last written. const entries: { path: SVGPathElement; text: string; published: string; width: number; first: number; split: boolean; slot: number; count: number; dots: number }[] = []; const indexOf = new Map(); - for (const color of new Set(palette)) { - const first = entries.length, { split, slot } = slotsOf(color); + const append = (color: string, { split, slot }: PointPaintSlots) => { + if (indexOf.has(color)) return; + const first = entries.length; indexOf.set(color, first); for (let band = 0; band < (split ? DOT_SLOTS : 1); band++) { const path = document.createElementNS(SVG_NS, 'path'); @@ -59,14 +60,17 @@ export function mountPointPaths(host: SVGElement, palette: readonly string[], sl path.setAttribute('fill', 'none'); path.setAttribute('stroke', color.split('@')[0]!); path.setAttribute('stroke-linecap', 'round'); group.append(path); entries.push({ path, text: '', published: '', width: 0, first, split, slot: split ? band : slot, count: 0, dots: 0 }); } - } + }; + for (const color of new Set(palette)) append(color, slotsOf(color)); let origin = '', move: readonly string[] = [], line: readonly string[] = []; // The slots this paint writes: every one when null. let due: ArrayLike | null = null; return { /** This palette's group: its opacity dims these paths alone. */ part, - residentElements: entries.length + 2, + get residentElements() { return entries.length + 2; }, + /** Prepared material variants join once at a settled material change, retaining their source paint's slot. */ + prepare(color: string, source: number) { const original = entries[source]!;append(color, original); }, /** A dot color's path, stroked as wide as its dots: resolved once for each point before any frame, so a frame only * adds positions. One path strokes all its dots at one width, so a paint (a color at a radius) is one size. */ entry(color: string, radius: number) { diff --git a/packages/renderer/src/universe/points/point-transmission-reader.ts b/packages/renderer/src/universe/points/point-transmission-reader.ts new file mode 100644 index 00000000000..b143358d9f2 --- /dev/null +++ b/packages/renderer/src/universe/points/point-transmission-reader.ts @@ -0,0 +1,6 @@ +import { parsePointTransmission } from '@cssearth/objects'; +import { fetchPreparedBank, preparedReader } from '../../prepared-data/prepared-readers.js'; +export const pointTransmissionReader = preparedReader('point-transmission', async (url,fetcher) => { + const value=parsePointTransmission(await fetchPreparedBank(url,fetcher)); + return {value,transfer:[...new Set([value.tau.buffer,value.colors.buffer])] as ArrayBuffer[]}; +}); diff --git a/packages/renderer/src/universe/points/point-transmission-transport.ts b/packages/renderer/src/universe/points/point-transmission-transport.ts new file mode 100644 index 00000000000..660541c2433 --- /dev/null +++ b/packages/renderer/src/universe/points/point-transmission-transport.ts @@ -0,0 +1,4 @@ +import type { PreparedPointTransmission } from '@cssearth/objects'; +import { readPrepared } from '../../prepared-data-worker-client.js'; +/** The registered reader runs in the data worker and transfers the prepared lookup buffers. */ +export const loadPointTransmission=(url:string)=>readPrepared('point-transmission',url); diff --git a/packages/renderer/src/universe/points/prepared-transmission.test.ts b/packages/renderer/src/universe/points/prepared-transmission.test.ts new file mode 100644 index 00000000000..5f9bfc38943 --- /dev/null +++ b/packages/renderer/src/universe/points/prepared-transmission.test.ts @@ -0,0 +1,163 @@ +import { test } from 'node:test'; +import assert from 'node:assert/strict'; +import { parsePointTransmission, PREPARED_POINT_TRANSMISSION_SCHEMA, type DensityVolumeFrame, type PreparedBank, type PreparedPointTransmission } from '@cssearth/objects'; +import { packPreparedBank } from '@cssearth/objects/node'; +import { cameraPoseToReferenceFrame, presentPhysicalPoseInVolume, rotateWorldPosition, worldRotationFromQuaternion, type WorldCameraPose } from '@cssearth/engine'; +import { readPreparedHere } from '../../prepared-data/readers.js'; +import { pointTransmissionAt, setPointTransmission, transmissionLookup, transmissionPaints } from './prepared-transmission.js'; + +const frame = { referenceFrame:'test',epochJdTt:1,originM:[0,0,0] as const,localToReferenceXyzw:[0,0,0,1] as const,metersPerUnit:1,boundsUnits:{min:[-1,-1,-1] as const,max:[1,1,1] as const} }; +function bank(): PreparedBank { + const tau=new Uint16Array(64),colors=new Uint8Array(2*3*256); + // Targets on the far side cross this test column; targets on its near face do not. + for(let observer=0;observer<8;observer++)for(let target=0;target<8;target++)tau[observer*8+target]=target%2===0?1000:0; + for(let level=0;level<2;level++)for(let band=0;band<3;band++)for(let value=0;value<256;value++)colors[(level*3+band)*256+value]=level?Math.round(value/(band+2)):value; + return {schema:PREPARED_POINT_TRANSMISSION_SCHEMA,fields:{frame,targetAxes:[[-1,1],[-1,1],[-1,1]],observerAxes:[[-2,2],[-2,2],[-2,2]],thresholds:[.5]},columns:{tau,colors}}; +} +const world={referenceFrame:'test',epochJdTt:1,pose:{positionM:[0,0,1.5] as const,orientationXyzw:[0,0,0,1] as const}}; +test('the registered reader decodes the packed table and transfers its shared buffer once',async()=>{ + const packed=packPreparedBank(bank()); + const result=await readPreparedHere('point-transmission','https://example.test/transfer.bin',async()=>new Response(new Uint8Array(packed))); + assert.deepEqual(result.value,parsePointTransmission(bank()));assert.equal(result.transfer.length,1); +}); +test('prepared dust dims and reddens a star behind it, with an unchanged near-side style',()=>{ + const field=parsePointTransmission(bank()),lookup=transmissionLookup(field,world,frame),paints=transmissionPaints(field,'#80a0c0ff@1'); + assert.equal(lookup([0,0,.9]),0);assert.equal(paints[0],'#80a0c0ff@1'); + assert.equal(lookup([0,0,-100]),1);assert.equal(paints[1],'#403530ff@1'); + const empty=bank();empty.columns.tau!.fill(0);assert.equal(transmissionLookup(parsePointTransmission(empty),world,frame)([0,0,-100]),0); +}); +test('prepared extinction respects the source frame and the selected owner',()=>{ + const field=parsePointTransmission(bank()),root={parentNode:null} as unknown as Node,child={parentNode:root} as unknown as Node,owner={}; + assert.equal(pointTransmissionAt(child),null);setPointTransmission(root,owner,field);assert.equal(pointTransmissionAt(child),field); + const translated={...frame,originM:[0,0,1000] as const}; + assert.equal(transmissionLookup(field,world,translated)([0,0,-999]),0); + assert.equal(transmissionLookup(field,world,translated)([0,0,-1100]),1); + setPointTransmission(root,owner,null);assert.equal(pointTransmissionAt(child),null); +}); +test('refuses malformed prepared optical tables rather than inventing missing transmission',()=>{ + const truncated=bank();assert.throws(()=>parsePointTransmission({...truncated,columns:{...truncated.columns,tau:new Uint16Array(63)}})); + assert.throws(()=>parsePointTransmission({...bank(),fields:{...bank().fields,observerAxes:[[2,-2],[-2,2],[-2,2]]}})); + assert.throws(()=>parsePointTransmission({...bank(),fields:{...bank().fields,thresholds:[NaN]}})); +}); + +/** Independent of the composed matrix: two engine rotations, then trilinear corners and the ray exit. */ +function referenceLevel(field: PreparedPointTransmission, world: WorldCameraPose, source: DensityVolumeFrame, point: readonly number[]): number { + const eye = presentPhysicalPoseInVolume(world.pose, field.frame).positionUnits; + const inverse = worldRotationFromQuaternion([-field.frame.localToReferenceXyzw[0], -field.frame.localToReferenceXyzw[1], -field.frame.localToReferenceXyzw[2], field.frame.localToReferenceXyzw[3]]); + const sourceRotation = worldRotationFromQuaternion(source.localToReferenceXyzw); + const origin = rotateWorldPosition(inverse, source.originM.map((value, k) => (value - field.frame.originM[k]!) / field.frame.metersPerUnit) as [number, number, number]); + const scaled = point.map(value => value * source.metersPerUnit / field.frame.metersPerUnit) as [number, number, number]; + let target = rotateWorldPosition(inverse, rotateWorldPosition(sourceRotation, scaled)).map((value, k) => value + origin[k]!); + let fraction = 1; + for (let k = 0; k < 3; k++) { + const delta = target[k]! - eye[k]!, axis = field.targetAxes[k]!, end = delta > 0 ? axis[axis.length - 1]! : axis[0]!; + if (delta !== 0) fraction = Math.min(fraction, Math.max(0, (end - eye[k]!) / delta)); + } + if (fraction < 1) target = target.map((value, k) => eye[k]! + fraction * (value - eye[k]!)); + const bracket = (axes: readonly (readonly number[])[], at: readonly number[]) => axes.map((axis, k) => { + let low = 0, high = axis.length - 1; + while (high - low > 1) { const mid = low + high >> 1; if (axis[mid]! <= at[k]!) low = mid; else high = mid; } + return { low, t: Math.max(0, Math.min(1, (at[k]! - axis[low]!) / (axis[low + 1]! - axis[low]!))) }; + }); + const sample = bracket(field.targetAxes, target), observer = bracket(field.observerAxes, eye); + const targetShape = field.targetAxes.map(axis => axis.length), observerShape = field.observerAxes.map(axis => axis.length); + const stride = targetShape.reduce((a, b) => a * b, 1); + let tau = 0; + for (let oa = 0; oa < 2; oa++) for (let ob = 0; ob < 2; ob++) for (let oc = 0; oc < 2; oc++) { + const view = ((observer[0]!.low + oa) * observerShape[1]! * observerShape[2]! + (observer[1]!.low + ob) * observerShape[2]! + observer[2]!.low + oc) * stride; + const viewWeight = (oa ? observer[0]!.t : 1 - observer[0]!.t) * (ob ? observer[1]!.t : 1 - observer[1]!.t) * (oc ? observer[2]!.t : 1 - observer[2]!.t); + for (let a = 0; a < 2; a++) for (let b = 0; b < 2; b++) for (let c = 0; c < 2; c++) { + const offset = ((sample[0]!.low + a) * targetShape[1]! + sample[1]!.low + b) * targetShape[2]! + sample[2]!.low + c; + tau += field.tau[view + offset]! * viewWeight * (a ? sample[0]!.t : 1 - sample[0]!.t) * (b ? sample[1]!.t : 1 - sample[1]!.t) * (c ? sample[2]!.t : 1 - sample[2]!.t); + } + } + const value = tau / 1000; + let level = 0; while (level < field.thresholds.length && value >= field.thresholds[level]!) level++; + return level; +} +function volume(origin: readonly [number, number, number], quaternion: readonly [number, number, number, number], metersPerUnit: number): DensityVolumeFrame { + return { referenceFrame: 'test', epochJdTt: 1, originM: origin, localToReferenceXyzw: quaternion, metersPerUnit, boundsUnits: { min: [-8, -8, -8], max: [8, 8, 8] } }; +} +test('composed source-to-field lookup matches an independent trilinear ray, including far exits', () => { + const targetAxes = [[-2, 0, 2], [-2, 0, 2], [-2, 0, 2]]; + const observerAxes = [[-4, 0, 4], [-4, 4], [-4, 4]]; + const stride = 27, tau = new Uint16Array(3 * 2 * 2 * stride), colors = new Uint8Array(2 * 3 * 256); + for (let level = 0; level < 2; level++) for (let band = 0; band < 3; band++) for (let value = 0; value < 256; value++) colors[(level * 3 + band) * 256 + value] = level ? Math.round(value / (band + 2)) : value; + for (let observer = 0; observer < 12; observer++) for (let ix = 0; ix < 3; ix++) for (let iy = 0; iy < 3; iy++) for (let iz = 0; iz < 3; iz++) { + const hot = ix === 1 && iy === 1 && iz === 1 || ix === 2 && iy === 2; + tau[observer * stride + (ix * 3 + iy) * 3 + iz] = hot ? 1000 : 0; + } + const fieldFrame = volume([10, -20, 30], [0, 1, 0, 0], 2); + const source = volume([14, -20, 36], [1, 0, 0, 0], 4); + const field = parsePointTransmission({ schema: PREPARED_POINT_TRANSMISSION_SCHEMA, fields: { frame: fieldFrame, targetAxes, observerAxes, thresholds: [.5] }, columns: { tau, colors } }); + // Eye at field units [-1,-1,-1]: Ry180 maps local metres [-2,-2,-2] to [2,-2,2]. + const world = { referenceFrame: 'test', epochJdTt: 1, pose: { positionM: [12, -22, 32] as const, orientationXyzw: [0, 0, 0, 1] as const } }; + const lookup = transmissionLookup(field, world, source); + const inside: readonly number[] = [-1, 0, 1.5], clear: readonly number[] = [0, 1, .5]; + const far: readonly number[] = [-11, -.875, 1.25], face: readonly number[] = [-2, -.875, 1.25]; + for (const point of [inside, clear, far, face]) assert.equal(lookup(point), referenceLevel(field, world, source, point)); + assert.equal(lookup(inside), 1, 'rotated scaled node is reddened'); + assert.equal(lookup(clear), 0, 'a zero bin stays clear'); + assert.equal(lookup(face), 1, 'the unclipped exit face is reddened'); + assert.equal(lookup(far), 0, 'the ray exits before the reddened face'); + assert.equal(transmissionPaints(field, '#80a0c0ff@1')[1], '#403530ff@1'); + const started = performance.now(); + let sink = 0; + for (let n = 0; n < 20000; n++) sink += lookup(far); + const elapsed = performance.now() - started; + assert.equal(sink, 0); + console.log(`transmissionLookup far-point mean ${(elapsed / 20).toFixed(3)} µs over 20000 calls`); +}); +test('observer bins stay interpolated, and a point behind the eye keeps the same exit', () => { + const targetAxes = [[-2, 2], [-2, 2], [-2, 2]], observerAxes = [[-4, 0], [-4, 4], [-4, 4]]; + const tau = new Uint16Array(2 * 2 * 2 * 8), colors = new Uint8Array(2 * 3 * 256); + for (let ox = 0; ox < 2; ox++) for (let oy = 0; oy < 2; oy++) for (let oz = 0; oz < 2; oz++) for (let target = 0; target < 8; target++) { + tau[(((ox * 2 + oy) * 2 + oz) * 8) + target] = ox ? 1000 : 0; + } + const fieldFrame = volume([0, 0, 0], [0, 0, 0, 1], 1), source = volume([0, 0, 0], [0, 0, 0, 1], 1); + const field = parsePointTransmission({ schema: PREPARED_POINT_TRANSMISSION_SCHEMA, fields: { frame: fieldFrame, targetAxes, observerAxes, thresholds: [.5] }, columns: { tau, colors } }); + const world = { referenceFrame: 'test', epochJdTt: 1, pose: { positionM: [-2, 0, 0] as const, orientationXyzw: [0, 0, 0, 1] as const } }; + const lookup = transmissionLookup(field, world, source); + assert.equal(lookup([0, 0, 0]), 1); + assert.equal(lookup([0, 0, 0]), referenceLevel(field, world, source, [0, 0, 0])); + const behind: readonly number[] = [-10, -1, -1]; + assert.equal(lookup(behind), referenceLevel(field, world, source, behind)); + assert.equal(lookup(behind), 1); +}); + +test('seeded noncommuting frame rotations preserve observer and target interpolation across repeated far rays', () => { + let state = 45; + const random = () => { state = Math.imul(1664525, state) + 1013904223 | 0; return (state >>> 0) / 4294967296; }; + const vector = (extent: number): [number, number, number] => [(2 * random() - 1) * extent, (2 * random() - 1) * extent, (2 * random() - 1) * extent]; + const quaternion = (): [number, number, number, number] => { + const axis = vector(1), length = Math.hypot(...axis), angle = (2 * random() - 1) * Math.PI, s = Math.sin(angle / 2) / length; + return [axis[0] * s, axis[1] * s, axis[2] * s, Math.cos(angle / 2)]; + }; + const targetAxes = [[-3, -1, .2, 4], [-4, -.3, 2], [-2, .1, .9, 3]], observerAxes = [[-6, -2, 1, 6], [-5, 0, 7], [-8, 8]]; + const thresholds = [.5, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60], colors = new Uint8Array((thresholds.length + 1) * 3 * 256); + const tau = Uint16Array.from({ length: 4 * 3 * 4 * 4 * 3 * 2 }, () => Math.floor(random() * 60000)); + let comparisons = 0; const bins = new Set(); + for (let trial = 0; trial < 32; trial++) { + const fieldOrigin = vector(100), fieldRotation = quaternion(), meters = 10 ** (random() * 4 - 2); + const fieldFrame = volume(fieldOrigin, fieldRotation, meters), shift = rotateWorldPosition(worldRotationFromQuaternion(fieldRotation), vector(meters * .3)); + const source = volume([fieldOrigin[0] + shift[0], fieldOrigin[1] + shift[1], fieldOrigin[2] + shift[2]], quaternion(), meters * 10 ** (random() * 2 - 1)); + const eye = vector(12), pose = cameraPoseToReferenceFrame({ positionM: [eye[0] * meters, eye[1] * meters, eye[2] * meters], orientationXyzw: [0, 0, 0, 1] }, fieldFrame); + const camera: WorldCameraPose = { referenceFrame: 'test', epochJdTt: 1, pose }; + const field = parsePointTransmission({ schema: PREPARED_POINT_TRANSMISSION_SCHEMA, fields: { frame: fieldFrame, targetAxes, observerAxes, thresholds }, columns: { tau, colors } }); + const lookup = transmissionLookup(field, camera, source); + const points = [[0, 0, 0], ...Array.from({ length: 128 }, () => vector(10)), [1e6, 0, 0], [-1e6, 0, 0], [0, 1e6, 0], [0, 0, -1e6]]; + for (const point of points) { + const expected = referenceLevel(field, camera, source, point), actual = lookup(point); + assert.equal(actual, expected, `trial ${trial}, point ${point}`); bins.add(actual); comparisons++; + } + // Target bracketing mutates closure-local scalars; it must not corrupt the prepared observer weights. + for (const point of points.slice(0, 12).reverse()) assert.equal(lookup(point), referenceLevel(field, camera, source, point)); + const withoutMap = new Proxy(points[0]!, { get(target, property, receiver) { + if (property === 'map') throw Error('The per-target path allocated a mapped coordinate array.'); + return Reflect.get(target, property, receiver); + } }); + assert.equal(lookup(withoutMap), referenceLevel(field, camera, source, points[0]!)); + } + assert.equal(comparisons, 4256); + assert.ok(bins.size >= 8, 'Equivalence must exercise many transmission bins rather than an unchanged output.'); +}); diff --git a/packages/renderer/src/universe/points/prepared-transmission.ts b/packages/renderer/src/universe/points/prepared-transmission.ts new file mode 100644 index 00000000000..a666dfa83fb --- /dev/null +++ b/packages/renderer/src/universe/points/prepared-transmission.ts @@ -0,0 +1,92 @@ +import { presentPhysicalPoseInVolume, worldRotationFromQuaternion, rotateWorldPosition, type WorldCameraPose } from '@cssearth/engine'; +import type { WorldRotation } from '@cssearth/core'; +import type { DensityVolumeFrame, PreparedPointTransmission } from '@cssearth/objects'; + +const fields = new WeakMap>(); +/** A region contributes only while its owning dataset is enabled. Other scenes inherit no material. */ +export function setPointTransmission(host: Node, owner: object, field: PreparedPointTransmission | null): void { + let owned = fields.get(host); + if (!owned && field) fields.set(host, owned = new Map()); + if (field) owned!.set(owner, field); else owned?.delete(owner); +} +export function pointTransmissionAt(host: Node): PreparedPointTransmission | null { + for (let node: Node | null = host; node; node = node.parentNode) { + const owned = fields.get(node); + if (owned?.size) return owned.values().next().value ?? null; + } + return null; +} +export function transmissionPaints(field: PreparedPointTransmission, paint: string): readonly string[] { + const rgb = [1, 3, 5].map(at => parseInt(paint.slice(at, at + 2), 16)); + return Array.from({ length: field.thresholds.length + 1 }, (_, level) => '#' + rgb.map((value, band) => + field.colors[(level * 3 + band) * 256 + value]!.toString(16).padStart(2, '0')).join('') + paint.slice(7)); +} +/** Row-major composition: apply `second`, then `first`. One source→field map per lookup, not per star. */ +function composeRotation(first: WorldRotation, second: WorldRotation): WorldRotation { + return [ + first[0] * second[0] + first[1] * second[3] + first[2] * second[6], + first[0] * second[1] + first[1] * second[4] + first[2] * second[7], + first[0] * second[2] + first[1] * second[5] + first[2] * second[8], + first[3] * second[0] + first[4] * second[3] + first[5] * second[6], + first[3] * second[1] + first[4] * second[4] + first[5] * second[7], + first[3] * second[2] + first[4] * second[5] + first[5] * second[8], + first[6] * second[0] + first[7] * second[3] + first[8] * second[6], + first[6] * second[1] + first[7] * second[4] + first[8] * second[7], + first[6] * second[2] + first[7] * second[5] + first[8] * second[8], + ]; +} +/** Only interpolation and selection from prepared values; no ray integration, grain law or optical calculation. */ +export function transmissionLookup(field: PreparedPointTransmission, world: WorldCameraPose, frame: DensityVolumeFrame) { + const eye = presentPhysicalPoseInVolume(world.pose, field.frame).positionUnits; + const targetShape = field.targetAxes.map(axis => axis.length); + const observerShape = field.observerAxes.map(axis => axis.length), stride = targetShape.reduce((a, b) => a * b, 1); + const inverse = worldRotationFromQuaternion([-field.frame.localToReferenceXyzw[0], -field.frame.localToReferenceXyzw[1], -field.frame.localToReferenceXyzw[2], field.frame.localToReferenceXyzw[3]]); + const sourceRotation = worldRotationFromQuaternion(frame.localToReferenceXyzw); + const placed = composeRotation(inverse, sourceRotation); + const scale = frame.metersPerUnit / field.frame.metersPerUnit; + const origin = rotateWorldPosition(inverse, frame.originM.map((value, k) => (value - field.frame.originM[k]!) / field.frame.metersPerUnit) as [number, number, number]); + let low0 = 0, t0 = 0, low1 = 0, t1 = 0, low2 = 0, t2 = 0; + const bracket = (axis: readonly number[], value: number, index: 0 | 1 | 2) => { + let low = 0, high = axis.length - 1; + while (high - low > 1) { const mid = low + high >> 1; if (axis[mid]! <= value) low = mid; else high = mid; } + let t = (value - axis[low]!) / (axis[low + 1]! - axis[low]!); + if (t < 0) t = 0; else if (t > 1) t = 1; + if (index === 0) { low0 = low; t0 = t; } else if (index === 1) { low1 = low; t1 = t; } else { low2 = low; t2 = t; } + }; + bracket(field.observerAxes[0]!, eye[0]!, 0); bracket(field.observerAxes[1]!, eye[1]!, 1); bracket(field.observerAxes[2]!, eye[2]!, 2); + const observerOffset = new Float64Array(8), observerWeight = new Float64Array(8); + let view = 0; + for (let a = 0; a < 2; a++) for (let b = 0; b < 2; b++) for (let c = 0; c < 2; c++, view++) { + observerOffset[view] = ((low0 + a) * observerShape[1]! * observerShape[2]! + (low1 + b) * observerShape[2]! + low2 + c) * stride; + observerWeight[view] = (a ? t0 : 1 - t0) * (b ? t1 : 1 - t1) * (c ? t2 : 1 - t2); + } + const ny = targetShape[1]!, nz = targetShape[2]!; + const xAxis = field.targetAxes[0]!, yAxis = field.targetAxes[1]!, zAxis = field.targetAxes[2]!; + const xEnd = xAxis.length - 1, yEnd = yAxis.length - 1, zEnd = zAxis.length - 1; + const ex = eye[0]!, ey = eye[1]!, ez = eye[2]!, ox = origin[0]!, oy = origin[1]!, oz = origin[2]!; + return (point: readonly number[]): number => { + const x = point[0]! * scale, y = point[1]! * scale, z = point[2]! * scale; + let tx = placed[0] * x + placed[1] * y + placed[2] * z + ox; + let ty = placed[3] * x + placed[4] * y + placed[5] * z + oy; + let tz = placed[6] * x + placed[7] * y + placed[8] * z + oz; + // A more distant star retains the transmission to the region's exit on that same ray. + let fraction = 1; + const dx = tx - ex, dy = ty - ey, dz = tz - ez; + if (dx !== 0) { const bound = ((dx > 0 ? xAxis[xEnd]! : xAxis[0]!) - ex) / dx; const clamped = bound < 0 ? 0 : bound; if (clamped < fraction) fraction = clamped; } + if (dy !== 0) { const bound = ((dy > 0 ? yAxis[yEnd]! : yAxis[0]!) - ey) / dy; const clamped = bound < 0 ? 0 : bound; if (clamped < fraction) fraction = clamped; } + if (dz !== 0) { const bound = ((dz > 0 ? zAxis[zEnd]! : zAxis[0]!) - ez) / dz; const clamped = bound < 0 ? 0 : bound; if (clamped < fraction) fraction = clamped; } + if (fraction < 1) { tx = ex + fraction * dx; ty = ey + fraction * dy; tz = ez + fraction * dz; } + bracket(xAxis, tx, 0); bracket(yAxis, ty, 1); bracket(zAxis, tz, 2); + const xLow = low0, yLow = low1, zLow = low2, xt = t0, yt = t1, zt = t2; + let tau = 0; + for (let a = 0; a < 2; a++) for (let b = 0; b < 2; b++) for (let c = 0; c < 2; c++) { + const offset = ((xLow + a) * ny + yLow + b) * nz + zLow + c; + const weight = (a ? xt : 1 - xt) * (b ? yt : 1 - yt) * (c ? zt : 1 - zt); + if (weight === 0) continue; + for (let corner = 0; corner < 8; corner++) tau += field.tau[observerOffset[corner]! + offset]! * observerWeight[corner]! * weight; + } + const value = tau / 1000; + let level = 0; while (level < field.thresholds.length && value >= field.thresholds[level]!) level++; + return level; + }; +} diff --git a/packages/renderer/src/universe/prepared-universe-types.ts b/packages/renderer/src/universe/prepared-universe-types.ts index 9cd26a9ef4e..dd28380cd5e 100644 --- a/packages/renderer/src/universe/prepared-universe-types.ts +++ b/packages/renderer/src/universe/prepared-universe-types.ts @@ -88,7 +88,11 @@ export interface PreparedUniverseOptions { * first time the bank shows from afar. */ loadBacking?(id: string): Promise<{ payload: PreparedGalaxyBacking; resolveResource(path: string): string }>; /** A bank's payload, and any published catalogue points drawn with it (M87's globular clusters). */ - loadVolumeDataset?(id: string): Promise[0] & { cataloguePointUrls?: readonly string[] }>; + loadVolumeDataset?(id: string): Promise[0] & { + cataloguePointUrls?: readonly string[]; pointTransmission?: import('@cssearth/objects').PreparedPointTransmission; + /** Existing cloud point/segment banks selected with the volume dataset, using the image-layer overlay contract. */ + overlayUrls?: Readonly>; + }>; /** Testable cap for hidden banks with no active navigation subscriber. */ warmVolumeDatasetDomNodeBudget?: number; catalog?: PreparedCatalogBank; diff --git a/packages/renderer/src/universe/universe-dataset-banks.test.ts b/packages/renderer/src/universe/universe-dataset-banks.test.ts index d51c65e582e..bfa21e67e55 100644 --- a/packages/renderer/src/universe/universe-dataset-banks.test.ts +++ b/packages/renderer/src/universe/universe-dataset-banks.test.ts @@ -6,6 +6,19 @@ import { createSceneLifetime } from '@cssearth/engine'; import type { PreparedVolumeDatasets } from '@cssearth/objects'; const decode = { ready: true, pending: new Set(), undrawn: 0 }; +const overlays: { url: string; opacity: number; publications: number; coasting: boolean; retired: boolean; destroyed: boolean; resolveResource(path: string): string }[] = []; +mock.module('./clouds/cloud-points.js', { namedExports: { + mountCloudOverlay: ({ url, resolveResource }: { url: string; resolveResource(path: string): string }) => { + const overlay = { url, resolveResource, opacity: 0, publications: 0, coasting: false, retired: false, destroyed: false }; + overlays.push(overlay); + return { + publish(_publication: unknown, opacity: number) { overlay.opacity = opacity; overlay.publications++; }, + setCoasting(active: boolean) { overlay.coasting = active; if (!active && overlay.retired) overlay.destroyed = true; }, + retire() { overlay.retired = true; if (!overlay.coasting) overlay.destroyed = true; }, + destroy() { overlay.destroyed = true; }, + }; + }, +} }); mock.module('../volume/volume-texture-readiness.js', { namedExports: { createVolumeTextureReadiness: () => ({ ready: (urls: readonly string[]) => decode.ready && urls.every(url => !decode.pending.has(url)), decoded: (url: string) => decode.ready && !decode.pending.has(url), undrawn() { decode.undrawn++; }, destroy() {} }), @@ -25,7 +38,7 @@ mock.module('../volume/prepared-volume-datasets.js', { namedExports: { } }); // The modules under test import the mocked ones, so they load after the mocks. const { createUniverseDatasetBanks } = await import('./universe-dataset-banks.js'); -afterEach(() => { decode.ready = true; decode.pending.clear(); decode.undrawn = 0; }); +afterEach(() => { decode.ready = true; decode.pending.clear(); decode.undrawn = 0; overlays.length = 0; }); const frame = { referenceFrame: 'fixture', epochJdTt: 1, originM: [0, 0, 0] as const, localToReferenceXyzw: [0, 0, 0, 1] as const, metersPerUnit: 1, boundsUnits: { min: [-1, -1, -1] as const, max: [1, 1, 1] as const } }; @@ -34,13 +47,19 @@ const payload: PreparedVolumeDatasets = { schema: 'cssearth-volume-datasets@1', framingRadiusUnits: 1, pointVisibility: visibility, datasets: [{ id: 'optical', label: 'Optical', title: 'Optical', stars: { frame, points: [] }, description: 'Fixture', sourceUrl: 'https://example.org', brightness: { overall: 1, x: 1, y: 1, z: 1 }, volume: { schema: 'cssearth-css-volume@1', id: 'fixture', frame, stacks: [], resources: [], provenance: {}, approximation: {} } }] }; -async function fixture(attached = false, hidden: (id: string) => boolean = () => false) { +async function fixture(attached = false, hidden: (id: string) => boolean = () => false, + overlayUrls?: Readonly>, warmDomNodeBudget = 10000) { const { document } = parseHTML('
'); const root = document.getElementById('back')!, frontRoot = document.getElementById('front')!; const lifetime = createSceneLifetime(); const banks = createUniverseDatasetBanks({ prepareBillboardImage: () => true, root, end: root.firstElementChild!, frontRoot, frontEnd: frontRoot.firstElementChild!, hidden, lifetime, declarations: [{ id: 'fixture', frame }], facts: [{ id: 'fixture', contextVisibility: 'independent', attached }], - frame, visibility, warmDomNodeBudget: 10000, load: async () => ({ payload, resolveResource: path => path }) }); + frame, visibility, warmDomNodeBudget, load: async () => ({ + payload: overlayUrls ? { ...payload, datasets: [...new Set(['optical', ...Object.keys(overlayUrls)])].map(id => ({ ...payload.datasets[0]!, id })) } : payload, + overlayUrls, resolveResource: path => `/bank-assets/${path}` }) }); + if (warmDomNodeBudget === 0) banks.publish({ referenceFrame: 'fixture', epochJdTt: 1, + pose: { positionM: [0, 0, 10], orientationXyzw: [0, 0, 0, 1] } }, + { focalPixels: 100, principalOffsetPixels: [0, 0], widthPixels: 400, heightPixels: 300 }, 1, 1); await banks.focusBank('fixture')!.load(); const targets = [root.firstElementChild!, frontRoot.firstElementChild!] as HTMLElement[]; if (attached) banks.setEnabled('fixture', true); @@ -50,6 +69,53 @@ async function fixture(attached = false, hidden: (id: string) => boolean = () => return { banks, targets, publish, lifetime }; } +test('volume datasets reuse the declared cloud renderer, fade with their bank, and release it with the scene', async () => { + const f = await fixture(false, undefined, { optical: ['/bank-assets/cloud.bin'] }); + assert.equal(overlays.length, 0, 'loading the bank does not fetch an unshown cloud'); + f.publish(); + assert.equal(overlays.length, 1); + assert.equal(overlays[0]!.url, '/bank-assets/cloud.bin'); + assert.equal(overlays[0]!.resolveResource('atlas.webp'), '/bank-assets/atlas.webp'); + assert.equal(overlays[0]!.opacity, 1); + f.publish(.5); + assert.equal(overlays[0]!.opacity, .5); + f.banks.setCoasting(true); f.publish(0); + assert.equal(overlays[0]!.opacity, 0); + assert.equal(overlays[0]!.coasting, true); + assert.equal(overlays[0]!.destroyed, false, 'the retained layer fades during inertia'); + f.lifetime.destroy(); + assert.equal(overlays[0]!.destroyed, true); +}); + +test('volume cloud overlays follow the displayed dataset after decoding and coasting, then retire the old cloud', async () => { + const f = await fixture(false, undefined, { optical: ['/optical.bin'], dust: ['/dust.bin'] }); + f.publish(); + const optical = overlays[0]!; + decode.pending.add('/dust.webp'); f.banks.select('fixture', 'dust'); f.publish(); + assert.equal(overlays.length, 1, 'the staged dataset is not the displayed dataset'); + decode.pending.clear(); f.banks.setCoasting(true); f.publish(); + assert.equal(overlays.length, 1, 'the image and cloud swap wait for inertia'); + f.banks.setCoasting(false); f.publish(); + assert.equal(overlays.length, 2); + assert.equal(optical.retired, true); + assert.equal(optical.destroyed, true); + assert.equal(overlays[1]!.url, '/dust.bin'); + assert.equal(overlays[1]!.opacity, 1); + f.lifetime.destroy(); +}); + +test('warm bank eviction waits for the coast to stop and releases its cloud with it', async () => { + const f = await fixture(false, undefined, { optical: ['/cloud.bin'] }, 0); + f.publish(); + f.banks.setCoasting(true); f.publish(0); + assert.equal(f.targets[0]!.isConnected, true); + assert.equal(overlays[0]!.destroyed, false); + f.banks.setCoasting(false); + assert.equal(f.targets[0]!.isConnected, false); + assert.equal(overlays[0]!.destroyed, true); + f.lifetime.destroy(); +}); + for (const stillCoasting of [true, false]) test(`a resident bank recovers after a decode gap; still coasting=${stillCoasting}`, async () => { const f = await fixture(); f.publish(); diff --git a/packages/renderer/src/universe/universe-dataset-banks.ts b/packages/renderer/src/universe/universe-dataset-banks.ts index 046709d5d11..13a497e5673 100644 --- a/packages/renderer/src/universe/universe-dataset-banks.ts +++ b/packages/renderer/src/universe/universe-dataset-banks.ts @@ -14,9 +14,12 @@ import { createFarBackingPlanes, drawsFromAfar, type FarBackingPlane } from './g import { mountCataloguePoints } from './points/catalogue-points.js'; import { fetchPreparedCatalogueBank } from './points/catalogue-point-transport.js'; import type { PreparedUniverseOptions } from './prepared-universe-types.js'; +import { setPointTransmission } from './points/prepared-transmission.js'; +import { createDatasetCloudOverlays } from './clouds/dataset-cloud-overlays.js'; type DatasetMount = ReturnType['mount']>; interface DatasetBank { + transmission?: import('@cssearth/objects').PreparedPointTransmission; readonly id: string; readonly facts: DatasetBankBillboard; readonly billboardIndex: number; @@ -26,6 +29,7 @@ interface DatasetBank { failure?: string; /** Catalogue points drawn inside the mounted bank, with its opacity. */ points: ReturnType[]; + clouds: ReturnType | null; textures: ReturnType | null; loading: Promise | null; generation: number; @@ -65,7 +69,7 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif const farPlanes = createFarBackingPlanes({ root, before: end, lifetime, load: loadBacking, requestPublication }); const record = (declared: { id: string; frame: DensityVolumeFrame }, bankFacts: DatasetBankBillboard): DatasetBank => ({ id: declared.id, facts: bankFacts, billboardIndex: pictured(bankFacts) ? billboardCount++ : -1, far: bankFacts.backing ? farPlanes.add(declared.id, declared.frame) : null, - mounted: null, points: [], textures: null, loading: null, generation: 0, explicitEnabled: undefined, + mounted: null, points: [], clouds: null, textures: null, loading: null, generation: 0, explicitEnabled: undefined, // A bank's own star points stay hidden unless a caller shows them. pendingSelection: undefined, pendingStarsVisible: false, framing: { frame: declared.frame, radiusUnits: volumeFramingRadiusUnits(declared.frame), visibility }, @@ -75,12 +79,14 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif const banks: DatasetBank[] = declarations.map((declared, index) => record(declared, facts[index]!)); const byId = new Map(banks.map(bank => [bank.id, bank])); const release = (bank: DatasetBank) => lifetime.onDispose(() => { + setPointTransmission(root, bank, null); bank.generation++; const mounted = bank.mounted; bank.mounted = null; bank.loading = null; for (const points of bank.points) points.destroy(); bank.points = []; + bank.clouds?.destroy(); bank.clouds = null; mounted?.destroy(); bank.textures?.destroy(); bank.textures = null; }); @@ -115,9 +121,10 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif bank.residentNodes = bank.mounted ? Number(bank.mounted.root.dataset.volumeResidentDomNodes) || 1 : 0; } function evict(bank: DatasetBank) { - if (!bank.mounted || bank.visible || bank.subscribers > 0) return false; + if (!bank.mounted || bank.visible || bank.subscribers > 0 || coasting) return false; for (const points of bank.points) points.destroy(); bank.points = []; + bank.clouds?.destroy(); bank.clouds = null; bank.mounted.destroy(); bank.textures?.destroy(); bank.textures = null; bank.mounted = null; @@ -149,6 +156,9 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif const source = options.payload, whole = 'index' in source ? null : source; const loadedFrame = whole ? whole.datasets[0]!.volume.frame : (source as PreparedVolumeDatasetSource).frame; const datasetIds = (whole ?? (source as PreparedVolumeDatasetSource).index).datasets.map(dataset => dataset.id); + if (Object.keys(options.overlayUrls ?? {}).some(dataset => !datasetIds.includes(dataset))) { + throw new TypeError('Prepared volume cloud overlays must name a dataset in their bank.'); + } if (loadedFrame.referenceFrame !== frame.referenceFrame || loadedFrame.epochJdTt !== frame.epochJdTt) { throw new TypeError('Prepared volume datasets must share the universe reference frame and epoch.'); } @@ -167,8 +177,13 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif } catch (error) { mounted.destroy(); throw error; } if (lifetime.disposed || generation !== bank.generation) { mounted.destroy(); return; } bank.mounted = mounted; + bank.transmission = options.pointTransmission; const host = mounted.root; bank.points = (options.cataloguePointUrls ?? []).map(url => mountCataloguePoints({ host, url, loadBank: target => fetchPreparedCatalogueBank(target) })); + if (options.overlayUrls && Object.keys(options.overlayUrls).length) { + bank.clouds = createDatasetCloudOverlays({ host: root, before: end, urls: options.overlayUrls, resolveResource: options.resolveResource }); + bank.clouds.setCoasting(coasting); + } bank.textures = createVolumeTextureReadiness(() => { requestPublication?.(); }); const pointVisibility = prepared.payload.pointVisibility!; bank.framing = { frame: loadedFrame, radiusUnits: prepared.payload.framingRadiusUnits, visibility: { @@ -285,6 +300,7 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif if (!bank?.facts.attached || bank.enabled === enabled) return; bank.explicitEnabled = enabled; bank.enabled = enabled; + if (!enabled) setPointTransmission(root, bank, null); requestPublication?.(); }, setStarsVisible(visible: boolean) { @@ -296,7 +312,11 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif }, /** While the camera coasts no bank mounts, shows or hides: a shown bank fades, the rest wait for the coast to stop * (motion-freezes-membership.md). */ - setCoasting(active: boolean) { coasting = active; billboards?.setCoasting(active); }, + setCoasting(active: boolean) { + coasting = active; billboards?.setCoasting(active); + for (const bank of banks) bank.clouds?.setCoasting(active); + if (!active) trimWarmResidency(); + }, /** Whether the bank's slices are on screen (its last publication drew them). */ drawing(id: string): boolean { return byId.get(id)?.drawn === true; }, /** `standIn`: the bank drawn in the detailed one's place until that one draws (detailed-focus-context.ts), of either @@ -321,6 +341,7 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif const shown = whole > 0 && detailed && flight ? whole * flight.closeUp * (volumeHolds(frame, radiusUnits, flight.toM) ? enteredVolumeOpacity(world, frame, radiusUnits) : 1) : whole; const requestedOpacity = shown * projectedVolumeOpacity(world, viewport, frame, radiusUnits, visibility); + setPointTransmission(root, bank, requestedOpacity > 0 ? bank.transmission ?? null : null); const incoming = bank.id === detailedObjectId; const ready = texturesReady(bank, { world, viewport }, shown > 0 && (requestedOpacity > 0 || incoming), incoming, requestedOpacity > 0); const opacity = ready ? requestedOpacity : 0; @@ -369,6 +390,7 @@ export function createUniverseDatasetBanks({ root, end, frontRoot, frontEnd, lif } } bank.mounted.publish({ world, viewport }, visible && Boolean(ready), coasting); + bank.clouds?.publish(bank.mounted.state().selectedDataset, { world, viewport }, opacity); if (visible && ready) for (const points of bank.points) points.publish({ world, viewport }); } if (residencyChanged) trimWarmResidency(); diff --git a/packages/renderer/src/volume/prepared-volume-datasets.test.ts b/packages/renderer/src/volume/prepared-volume-datasets.test.ts index 837fa194c20..a6f3fef9336 100644 --- a/packages/renderer/src/volume/prepared-volume-datasets.test.ts +++ b/packages/renderer/src/volume/prepared-volume-datasets.test.ts @@ -563,3 +563,16 @@ test('a hidden star presentation can switch datasets before its next stellar fil runtime.setStarsVisible(true);await source.load('second',true);await Promise.resolve();runtime.publish(publication()); assert.equal(runtime.state().starsVisible,true);assert.ok(source.stars('second'));runtime.destroy(); }); + +test('an explicitly resident bank retains every axis through a coasting direction change',()=>{ + const f=dom(),data={...payload(),starsEnabled:false}; + const runtime=createPreparedVolumeDatasets({payload:data,resolveResource:path=>`/prepared/${path}`,residentStacks:true}).mount(f.options); + runtime.publish(publication()); + const root=runtime.root as unknown as FakeElement,initial=descendants(root),axes=initial.filter(node=>node.className==='css-volume-projection'); + assert.equal(axes.length,3);assert.ok(axes.every(node=>node.style.display==='block'&&node.style.visibility==='visible')); + const leaves=initial.filter(node=>node.parentNode?.className==='css-volume-mesh');assert.equal(leaves.length,9); + runtime.publish(publication(4,[1,0,0]),true,true); + assert.deepEqual(descendants(root),initial);assert.ok(axes.every(node=>node.style.display==='block'&&node.style.visibility==='visible')); + assert.ok(leaves.every(node=>node.style.display!=='none'&&node.style.visibility!=='hidden')); + runtime.publish(publication(4,[1,0,0]),true,false);runtime.destroy(); +}); diff --git a/packages/renderer/src/volume/prepared-volume-datasets.ts b/packages/renderer/src/volume/prepared-volume-datasets.ts index fb9c3fc317d..570648e3ecf 100644 --- a/packages/renderer/src/volume/prepared-volume-datasets.ts +++ b/packages/renderer/src/volume/prepared-volume-datasets.ts @@ -123,8 +123,10 @@ type MountedDataset = Omit & { r /** Fixed declared bank; visible LODs attach their own textures on demand. `payload` is the bank's source (its index and * the datasets read so far), or a whole bank in memory. */ -export function createPreparedVolumeDatasets({ payload, resolveResource }: { +export function createPreparedVolumeDatasets({ payload, resolveResource, residentStacks = false }: { payload: PreparedVolumeDatasetSource | PreparedVolumeDatasets; resolveResource(path: string): string; + /** Small prepared banks may retain every axis for transform/opacity-only motion. */ + residentStacks?: boolean; }) { const source = 'index' in payload ? payload : preparedVolumeDatasetSource(payload); const data = source.index, pool = `volume-datasets:${data.id}`; @@ -219,7 +221,7 @@ export function createPreparedVolumeDatasets({ payload, resolveResource }: { Object.assign(surface.style, { position: 'absolute', inset: '0', pointerEvents: 'none', display: 'none' }); const marker = create('span'); marker.hidden = true; surface.append(marker); root.insertBefore(surface, end); const active = { dataset }; - const runtime = mountPreparedVolumeLod({ host: surface, before: marker, payload: dataset.volume, resolveResource: resolvePrepared, createElement: create, nativeFocalCss, lazyDetail: lazy }, + const runtime = mountPreparedVolumeLod({ host: surface, before: marker, payload: dataset.volume, resolveResource: resolvePrepared, createElement: create, nativeFocalCss, lazyDetail: lazy, residentStacks }, detail => volumeDatasetCompositeOpacity(stackShares(detail.roots), active.dataset.brightness)); for (const axisRoot of runtime.roots) axisRoot.style.background = 'transparent'; const family = { datasets: Object.freeze(datasets), active, surface, runtime }; diff --git a/packages/renderer/src/volume/prepared-volume-runtime.test.mts b/packages/renderer/src/volume/prepared-volume-runtime.test.mts index c03d0c0d275..24dd57e1f9c 100644 --- a/packages/renderer/src/volume/prepared-volume-runtime.test.mts +++ b/packages/renderer/src/volume/prepared-volume-runtime.test.mts @@ -2,7 +2,7 @@ import { readFileSync } from 'node:fs'; import { afterEach, test, mock } from 'node:test'; import assert from 'node:assert/strict'; import { validatePreparedCssVolume, type PreparedCssVolume, type VolumeVector } from '@cssearth/objects'; -import { mountPreparedCssVolume } from './prepared-volume-runtime.ts'; +import { mountPreparedCssVolume, preparedVolumeTexturePaths, STACK_OPACITY_CEILING } from './prepared-volume-runtime.ts'; import type { VolumeCameraPublication } from './types.ts'; import { stubGlobal, unstubAllGlobals } from '@cssearth/objects/node/contract'; @@ -55,6 +55,41 @@ function publication(direction: VolumeVector, position: VolumeVector = [0, 0, 10 } afterEach(() => unstubAllGlobals()); +test('fixed images keep one full-opacity prepared quad per leaf for every direction and camera distance', () => { + const source = payload(6), fixed = { ...source, fixedImages: true as const, + stacks: source.stacks.map(stack => stack.axis === 'z' ? stack : { ...stack, leaves: [] }) }; + const { runtime, roots, meshes, document, host, before } = mount(fixed, true); + assert.deepEqual(host.children, [roots[2], before], 'only the populated fixed-image axis enters layout and compositing'); + assert.equal(roots[0]!.parentNode, null); assert.equal(roots[1]!.parentNode, null); + assert.deepEqual(meshes.map(mesh => mesh.children.length), [0, 0, 6]); + const nodes = roots.flatMap((root, index) => [root, ...meshes[index]!.children]), quads = [...meshes[2]!.children], count = document.count; + runtime.publish(publication([0, 0, 1])); + const fixedStyles = quads.map(node => ({ ...node.style })); + for (const direction of [[0, 0, 1], [1, 0, 0], [0, 0, -1], [-1, .3, .1], [1, 1, 1]] as const) for (const position of [[0, 0, 10], [100, 0, -2], [0, 0, .1]] as const) { + for (const node of nodes) node.propertyWrites.length = 0; + runtime.publish(publication(direction, position)); + assert.deepEqual(roots.map(root => Number(root.style.opacity)), [0, 0, STACK_OPACITY_CEILING]); + assert.deepEqual(quads.map(node => node.style.opacity), Array(6).fill('1')); + assert.deepEqual(quads.map(node => ({ ...node.style })), fixedStyles, 'prepared image, UV, geometry and lighting are fixed'); + assert.equal(document.count, count); assert.deepEqual(meshes[2]!.children, quads); + assert.deepEqual(host.children, [roots[2], before], 'rotating and coasting never mount empty axis subtrees'); + assert.ok(nodes.flatMap(node => node.propertyWrites).every(key => key === 'transform'), 'resident fixed images never change opacity during rotation'); + assert.deepEqual(preparedVolumeTexturePaths(fixed, publication(direction, position)), ['z.png'], 'even edge-on/offscreen images stay resident and ready'); + } + for (const node of nodes) node.propertyWrites.length = 0; + runtime.publish(publication([1, 1, 1], [0, 0, .1])); + assert.deepEqual(nodes.flatMap(node => node.propertyWrites), []); + runtime.destroy(); +}); + +test('prepared directional faces retain baked backface culling on every optical copy', () => { + const data = payload(1); + for (const stack of data.stacks) for (const leaf of stack.leaves) Object.assign(leaf.style, { backfaceVisibility: 'hidden' }); + const { meshes, runtime } = mount(data); + for (const mesh of meshes) for (const node of mesh.children) assert.equal(node.style.backfaceVisibility, 'hidden'); + runtime.destroy(); +}); + function copyOpacity(copy: FakeElement): number { return copy.style.opacity === undefined ? 1 : Number(copy.style.opacity); } diff --git a/packages/renderer/src/volume/prepared-volume-runtime.ts b/packages/renderer/src/volume/prepared-volume-runtime.ts index e894559d1dc..f71699a6b94 100644 --- a/packages/renderer/src/volume/prepared-volume-runtime.ts +++ b/packages/renderer/src/volume/prepared-volume-runtime.ts @@ -57,7 +57,8 @@ export function mountPreparedCssVolume(options: PreparedVolumeMountOptions): Pre const opticalCopies: { nodes: HTMLElement[][]; alpha: number[]; wanted: boolean[]; shown: number[] }[] = []; // A bank whose images hold their three copies (mergedOpticalCopies) draws one layer a slice, at opacity gain / 3: on a // phone the 52/52/26 bank's 390 layers outran Chrome's 256 MB tile budget and drew empty in 248 frames of an 8 s turn. - const merged = payload.mergedOpticalCopies === 3, copiesPerLeaf = merged ? 1 : 3; + const fixed = payload.fixedImages === true; + const merged = payload.mergedOpticalCopies === 3, copiesPerLeaf = merged || fixed ? 1 : 3; for (const axis of AXES) { const stack = payload.stacks.find(candidate => candidate.axis === axis); if (!stack) throw new TypeError(`Prepared CSS volume has no ${axis} stack.`); @@ -104,7 +105,9 @@ export function mountPreparedCssVolume(options: PreparedVolumeMountOptions): Pre scene.append(mesh); camera.append(scene); root.append(camera); - options.host.insertBefore(root, options.before); + // Fixed images never select their empty axes. Keep their logical slots for axis-indexed state, but leave + // those perspective/transform subtrees unattached, including when a bank requests resident stacks. + if (!fixed || stack.leaves.length) options.host.insertBefore(root, options.before); roots.push(root); cameras.push(camera); scenes.push(scene); } let destroyed = false; @@ -228,8 +231,7 @@ export function mountPreparedCssVolume(options: PreparedVolumeMountOptions): Pre leaf.hidden = false; } } - const localCamera = presentPhysicalPoseInVolume(world.pose, payload.frame); - const strengths = axisWeights(localCamera, payload.stacks, payload.frame.boundsUnits); + const strengths = fixed ? fixedImageStrengths(payload) : axisWeights(presentPhysicalPoseInVolume(world.pose, payload.frame), payload.stacks, payload.frame.boundsUnits); for (const [axis, pending] of pendingTextures.entries()) { if (!options.residentStacks && strengths[axis]!.weight <= 0) continue; for (const [leaf, url] of pending) { @@ -261,6 +263,11 @@ export function mountPreparedCssVolume(options: PreparedVolumeMountOptions): Pre // n full copies plus a fraction f give T=(1-alpha)^n*(1-f*alpha). // Integer gains are exact; the fractional step linearly approximates alpha. const copies = opticalCopies[index]!; + if (fixed) { + if (copies.alpha[0] !== 1) { copies.alpha[0] = 1; for (const node of copies.nodes[0]!) node.style.opacity = '1'; } + if (visible !== copies.wanted[0]) { copies.wanted[0] = visible; if (visible) join.request(); else retire.request(); } + continue; + } // A shown copy keeps an 8-bit step of alpha inside [0.001, 0.999] and stays joined while its stack is visible, so a // turn never crosses opacity 0 or 1 and never changes the layer tree; each frame stays within 1/510 alpha of exact. // Copies crossing 0/1 and leaving or joining mid-turn made WebKit recomposite for 25-37 ms. iPad drag at the stripe @@ -339,11 +346,13 @@ function createLeaf(create: (tag: string) => HTMLElement, leaf: PreparedCssVolum node.style.transform = leaf.style.transform; node.style.backgroundSize = leaf.style.backgroundSize; node.style.backgroundPosition = leaf.style.backgroundPosition; + if (leaf.style.backfaceVisibility) node.style.backfaceVisibility = leaf.style.backfaceVisibility; return node; } /** Texture demand uses the same axis weights and prepared frustum bounds as publication. */ export function preparedVolumeTexturePaths(payload: PreparedCssVolume, publication: VolumeCameraPublication): readonly string[] { + if (payload.fixedImages) return [...new Set(payload.stacks.flatMap(stack => stack.leaves.map(leaf => leaf.texturePath)))]; const strengths = axisWeights(presentPhysicalPoseInVolume(publication.world.pose, payload.frame), payload.stacks, payload.frame.boundsUnits); const transform = preparedVolumeCameraTransform(publication, payload.frame, 50); const planes = createPreparedLeafFrustum(transform.rotation, transform.translationCssPixels, publication.viewport); @@ -357,6 +366,10 @@ export function preparedVolumeTexturePaths(payload: PreparedCssVolume, publicati return [...paths]; } +function fixedImageStrengths(payload: PreparedCssVolume): ReturnType { + return AXES.map(axis => ({ weight: payload.stacks.find(stack => stack.axis === axis)!.leaves.length ? 1 : 0, opticalGain: 1 })); +} + /** Opaque completed images, in DOM back-to-front order. Their total contribution is always the ceiling. */ export function completedStackOpacities(weights: readonly number[]): readonly number[] { const total = weights.reduce((sum, weight) => sum + weight, 0); diff --git a/packages/telescope-cli/authoring/m45/spitzer.mts b/packages/telescope-cli/authoring/m45/spitzer.mts new file mode 100644 index 00000000000..b3c4be0e58f --- /dev/null +++ b/packages/telescope-cli/authoring/m45/spitzer.mts @@ -0,0 +1,88 @@ +import { readFile, writeFile, stat } from 'node:fs/promises'; +import { resolve } from 'node:path'; +import { shaSearch, archiveUrl, listArchiveDirectory } from '../../src/archives/spitzer/archive.mts'; +import { requireRecord, requireArray, requireString } from '@cssearth/core'; +import { readFitsHdus, readFitsImage, skyProjection } from '@cssearth/fits'; + +const root = resolve('.local/infrared/spitzer'); +const save = async (name: string, value: unknown) => writeFile(resolve(root, name), JSON.stringify(value, null, 2)); +const aors = [8798976, 8798720, 6526720]; +interface Product { aor: number; channel: number; role: string; file: string; url: string; bytes: number } +if (process.argv.includes('--discover')) { + for (const aorKey of aors) { + const aor = await shaSearch({ id: 'aorByRequestID', aorKey: String(aorKey) }, { timeoutMs: 20000, attempts: 1 }); + const products = await shaSearch({ id: 'pbcdByRequestID', aorKey: String(aorKey) }, { timeoutMs: 20000, attempts: 1 }); + await save(`sha-${aorKey}-metadata.json`, { aor, products }); + console.log(JSON.stringify({ aorKey, aor, products: products.map(row => ({ name: row.externalname, url: row.heritagefilename && archiveUrl(row.heritagefilename), + channel: row.channum, wavelength: row.wavelength, width: row.naxis1, height: row.naxis2, bytes: row.filesize })) })); + } +} +if (process.argv.includes('--download-native')) { + const products: Product[] = []; + let totalBytes = 0; + for (const aor of aors.slice(0, 2)) for (const channel of [1, 2]) { + const listing = requireRecord(JSON.parse(await readFile(resolve(root, `sha-${aor}-ch${channel}-file-list.json`), 'utf8'))); + const directory = requireString(listing.directory), names = requireArray(listing.files).map(v => requireString(v)); + for (const role of ['maic', 'munc', 'mcov']) { + const candidates = names.filter(name => name.endsWith(`_${role}.fits`)); + if (candidates.length !== 1) throw new Error(`AOR${aor} channel${channel} has no unique ${role} file.`); + const name = candidates[0]!, url = directory + name; + const file = aor === 8798976 && role === 'maic' ? `pilot-mips${channel === 1 ? 24 : 70}-a.fits` + : `aor${aor}-mips${channel === 1 ? 24 : 70}-${role}.fits`; + let exists = false; + try { await stat(resolve(root, file)); exists = true; } catch (error) { + if (!(error instanceof Error) || !('code' in error) || error.code !== 'ENOENT') throw error; + } + if (!exists) { + const response = await fetch(url, { signal: AbortSignal.timeout(90000) }); + if (!response.ok || !response.body) throw new Error(`${response.status}: ${url}`); + const chunks: Uint8Array[] = []; let bytes = 0; + for await (const chunk of response.body) { + bytes += chunk.byteLength; + if (totalBytes + bytes > 200000000) throw new Error('Spitzer science-byte bound exceeded.'); + chunks.push(chunk); + } + const output = Buffer.concat(chunks); + if (!output.subarray(0, 8).equals(Buffer.from('SIMPLE '))) throw new Error(`Not a FITS file: ${url}`); + readFitsHdus(output); await writeFile(resolve(root, file), output); + } + const bytes = (await stat(resolve(root, file))).size; + totalBytes += bytes; + if (totalBytes > 200000000) throw new Error('Spitzer science-byte bound exceeded.'); + products.push({ aor, channel, role, file, url, bytes }); + await save('products.json', { schema: 'pleiades-spitzer-native-products@1', totalBytes, products }); + console.log('SPITZER_NATIVE_READY', JSON.stringify(products.at(-1))); + } + } +} +if (process.argv.includes('--list')) { + for (const aor of aors.slice(0, 2)) { + const value = requireRecord(JSON.parse(await readFile(resolve(root, `sha-${aor}-metadata.json`), 'utf8'))); + for (const raw of requireArray(value.products)) { + const row = requireRecord(raw); if (!['1', '2'].includes(String(row.channum))) continue; + const url = archiveUrl(requireString(row.heritagefilename)); + const directory = url.slice(0, url.lastIndexOf('/') + 1), files = await listArchiveDirectory(directory); + await save(`sha-${aor}-ch${row.channum}-file-list.json`, { directory, files }); console.log(JSON.stringify({ directory, files })); + } + } +} +if (process.argv.includes('--inspect')) { + for (const arg of process.argv.slice(process.argv.indexOf('--inspect') + 1)) { + const path = resolve(root, arg), bytes = await readFile(path), hdus = readFitsHdus(bytes); + const records = hdus.map((hdu, index) => { + const header = hdu.header, width = Number(header.NAXIS1), height = Number(header.NAXIS2); + if (!(width > 0 && height > 0)) return { index, header }; + const image = readFitsImage(bytes, { start: index ? hdus[index - 1]!.nextOffset : 0 }); + const finite = Array.from(image.values).filter(Number.isFinite).sort((a, b) => a - b); + const quantile = (f: number) => finite[Math.floor((finite.length - 1) * f)] ?? null; + const projection = skyProjection(header); + return { index, header, width, height, finitePixels: finite.length, positivePixels: finite.filter(v => v > 0).length, + totalPixels: width * height, statistics: { min: finite[0] ?? null, p05: quantile(.05), median: quantile(.5), p95: quantile(.95), max: finite.at(-1) ?? null }, + centerSky: projection.skyOf((width - 1) / 2, (height - 1) / 2), + cornerSky: [[0, 0], [width - 1, 0], [width - 1, height - 1], [0, height - 1]].map(([x, y]) => projection.skyOf(x!, y!)) }; + }); + await save(`${arg}.inspection.json`, { path, bytes: (await stat(path)).size, hdus: records }); + console.log(JSON.stringify({ path, hdus: records.map(({ header, ...rest }) => ({ ...rest, identity: { + AORKEY: header.AORKEY, INSTRUME: header.INSTRUME, CHNLNUM: header.CHNLNUM, BUNIT: header.BUNIT, CREATOR: header.CREATOR } })) })); + } +} diff --git a/packages/telescope-cli/authoring/m45/wise.mts b/packages/telescope-cli/authoring/m45/wise.mts new file mode 100644 index 00000000000..22ba7f8c6ea --- /dev/null +++ b/packages/telescope-cli/authoring/m45/wise.mts @@ -0,0 +1,133 @@ +/** Official AllWISE native-pixel cutouts. Acquisition/calibration only; no density model. */ +import { readFile, writeFile, mkdir, rename } from 'node:fs/promises'; +import { join, resolve } from 'node:path'; +import { gunzipSync } from 'node:zlib'; +import sharp from 'sharp'; +import { readFitsImage, skyProjection, type FitsHeader } from '@cssearth/fits'; + +type Band = 3 | 4; +type Kind = 'int' | 'unc' | 'cov'; +interface Region { coadd: string; center: [number, number]; size: string } +interface Product { band: Band; kind: Kind; coadd: string; path: string; url: string; parentUrl: string; bytes: number; decodedBytes: number; width: number; height: number; header: FitsHeader; stats: ReturnType; elapsedSeconds: number } +const ROOT = resolve('.local/infrared/wise'); +const BASE = 'https://irsa.ipac.caltech.edu/ibe/data/wise/allwise/p3am_cdd'; +// IV.4.h Table1 column2, constant Fnu equivalent: matches the heating grid's photon-count response. +// Table IV.3.a's conventional factors use F*nu0 instead and differ substantially in broad W3. +const FNU_ZERO: Record = { 3: 31.674, 4: 8.363 }; +const CONVERSION: Record = { 3: FNU_ZERO[3] * 10 ** (-.4 * 18), 4: FNU_ZERO[4] * 10 ** (-.4 * 13) }; +const finite = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value); +const record = (value: unknown): value is Record => typeof value === 'object' && value !== null && !Array.isArray(value); +async function json(path: string, value: unknown): Promise { await writeFile(path, JSON.stringify(value, null, 2) + '\n'); } +function statistics(values: Float64Array | Float32Array) { + let missing = 0, negative = 0, zero = 0, min = Infinity, max = -Infinity, sum = 0; + const samples: number[] = [], stride = Math.max(1, Math.floor(values.length / 200_000)); + for (let i = 0; i < values.length; i++) { + const v = values[i]!; + if (!Number.isFinite(v)) { missing++; continue; } + if (v < 0) negative++; if (v === 0) zero++; min = Math.min(min, v); max = Math.max(max, v); sum += v; + if (i % stride === 0) samples.push(v); + } + samples.sort((a, b) => a - b); + const q = (fraction: number) => samples.length ? samples[Math.floor((samples.length - 1) * fraction)]! : null; + return { pixels: values.length, finite: values.length - missing, missing, negative, zero, min: min === Infinity ? null : min, max: max === -Infinity ? null : max, + mean: values.length > missing ? sum / (values.length - missing) : null, p01: q(.01), p50: q(.5), p99: q(.99), p998: q(.998), quantileSamples: samples.length }; +} +function uncompressed(bytes: Buffer): Buffer { return bytes[0] === 0x1f && bytes[1] === 0x8b ? gunzipSync(bytes, { maxOutputLength: 100_000_000 }) : bytes; } +async function request(url: string, maximumBytes: number): Promise { + const response = await fetch(url, { signal: AbortSignal.timeout(120_000) }); + if (!response.ok) throw Error(`IRSA ${response.status}: ${url}`); + const length = Number(response.headers.get('content-length')); + if (length > maximumBytes) throw Error(`Response exceeds ${maximumBytes} bytes: ${url}`); + const bytes = Buffer.from(await response.arrayBuffer()); + if (bytes.length > maximumBytes) throw Error(`Downloaded response exceeds bound: ${url}`); + return bytes; +} +async function cached(path: string, url: string, maximumBytes: number): Promise { + try { return await readFile(path); } catch (error: unknown) { if (!record(error) || error.code !== 'ENOENT') throw error; } + const bytes = await request(url, maximumBytes); + await writeFile(path + '.partial', bytes); await rename(path + '.partial', path); return bytes; +} +async function acquire(directory: string, region: Region, band: Band, kind: Kind): Promise { + const start = performance.now(), stem = `${region.coadd}-w${band}-${kind}-3`, parentUrl = `${BASE}/${region.coadd.slice(0, 2)}/${region.coadd.slice(0, 4)}/${region.coadd}/${stem}.fits.gz`; + const query = new URLSearchParams({ center: region.center.join(','), size: region.size, gzip: 'true' }), url = `${parentUrl}?${query}`; + const path = join(directory, `${stem}.fits.gz`), bytes = await cached(path, url, 85_000_000), decoded = uncompressed(bytes); + const image = readFitsImage(decoded, { maxDecodedBytes: 160_000_000 }), h = image.header; + if (h.COADDID !== region.coadd || h.BAND !== band || h.BITPIX !== -32 || h.NAXIS !== 2 || h.CTYPE1 !== 'RA---SIN' || h.CTYPE2 !== 'DEC--SIN' || h.EQUINOX !== 2000 || h.CROTA2 !== 0) throw Error(`Unexpected atlas identity/WCS: ${path}`); + if (kind !== 'cov' && h.BUNIT !== 'DN' || kind === 'cov' && h.BUNIT !== 'effective pixels') throw Error(`Unexpected ${kind} units: ${String(h.BUNIT)}`); + if (h.MAGZP !== (band === 3 ? 18 : 13) || !finite(h.CDELT1) || !finite(h.CDELT2) || Math.abs(Math.abs(h.CDELT1) * 3600 - 1.375) > 1e-5 || Math.abs(Math.abs(h.CDELT2) * 3600 - 1.375) > 1e-5) throw Error(`Unexpected WISE calibration/pixel scale: ${path}`); + const product: Product = { band, kind, coadd: region.coadd, path, url, parentUrl, bytes: bytes.length, decodedBytes: decoded.length, width: image.width, height: image.height, header: h, stats: statistics(image.values), elapsedSeconds: (performance.now() - start) / 1000 }; + await json(path.replace('.fits.gz', '.header.json'), { immutableParentUrl: parentUrl, requested: region, receivedCompressed: bytes[0] === 0x1f && bytes[1] === 0x8b, ...product }); + console.log(JSON.stringify({ signal: 'WISE_PRODUCT_READY', coadd: region.coadd, band, kind, width: image.width, height: image.height, bytes: bytes.length, missing: product.stats.missing })); + return product; +} +async function f32(path: string, values: Float32Array): Promise { + const bytes = Buffer.alloc(values.length * 4); for (let i = 0; i < values.length; i++) bytes.writeFloatLE(values[i]!, i * 4); await writeFile(path, bytes); +} +async function exportTriplet(directory: string, products: Product[], band: Band, coadd: string) { + const find = (kind: Kind) => { const p = products.find(p => p.band === band && p.coadd === coadd && p.kind === kind); if (!p) throw Error(`Missing ${kind}`); return p; }; + const ip = find('int'), up = find('unc'), cp = find('cov'); + const [intensity, uncertainty, coverage] = await Promise.all([ip, up, cp].map(async p => readFitsImage(uncompressed(await readFile(p.path)), { maxDecodedBytes: 160_000_000 }))); + if (!intensity || !uncertainty || !coverage || intensity.width !== uncertainty.width || intensity.height !== uncertainty.height || intensity.width !== coverage.width || intensity.height !== coverage.height) throw Error('Atlas triplet dimensions do not agree.'); + for (const key of ['CRPIX1', 'CRPIX2', 'CRVAL1', 'CRVAL2', 'CDELT1', 'CDELT2']) if (intensity.header[key] !== uncertainty.header[key] || intensity.header[key] !== coverage.header[key]) throw Error(`Triplet WCS differs: ${key}`); + const h = intensity.header; + if (!finite(h.CDELT1) || !finite(h.CDELT2)) throw Error('Missing pixel scale.'); + const solidAngle = Math.abs(h.CDELT1 * h.CDELT2) * (Math.PI / 180) ** 2, factor = CONVERSION[band] / solidAngle / 1e6; + const n = intensity.values.length, plane = new Float32Array(n), sigma = new Float32Array(n), cov = Float32Array.from(coverage.values), observed = new Uint8Array(n), flags = new Uint8Array(n); + let lowCoverage = 0, unknown = 0; + for (let p = 0; p < n; p++) { + const i = intensity.values[p]!, u = uncertainty.values[p]!, c = coverage.values[p]!; + plane[p] = Number.isFinite(i) ? i * factor : NaN; sigma[p] = Number.isFinite(u) ? u * factor : NaN; + const good = Number.isFinite(i) && Number.isFinite(u) && u > 0 && Number.isFinite(c) && c > 0; + observed[p] = good ? 255 : 0; + if (!good) { flags[p] |= 1; unknown++; } + if (Number.isFinite(c) && c < 6) { flags[p] |= 2; lowCoverage++; } + } + const stem = join(directory, `${coadd}-w${band}`); + await f32(stem + '.mjysr.f32', plane); await f32(stem + '.uncertainty-mjysr.f32', sigma); await f32(stem + '.coverage.f32', cov); + await writeFile(stem + '.observed.u8', observed); await writeFile(stem + '.quality.u8', flags); + const nativeWcs = skyProjection(h), namedRows = (await readFile('.local/named-stars.csv', 'utf8')).trim().split(/\r?\n/u).slice(1); + const knownStars = namedRows.map(line => { const cells = line.split(','), ra = Number(cells[1]), dec = Number(cells[2]); if (!Number.isFinite(ra) || !Number.isFinite(dec)) throw Error('Named-star position invalid.'); const pixel = nativeWcs.pixelOf(ra, dec); return { hip: Number(cells[0]), ra, dec, fitsStoredPixel: pixel, inside: !!pixel && pixel[0] >= 0 && pixel[1] >= 0 && pixel[0] < intensity.width && pixel[1] < intensity.height }; }); + const sourceStats = statistics(plane), lo = sourceStats.p01 ?? 0, hi = sourceStats.p998 ?? 1, scale = Math.max(1e-12, hi - lo), bytes = new Uint8Array(n); + for (let p = 0; p < n; p++) bytes[p] = observed[p] ? Math.min(255, Math.round(255 * Math.asinh(8 * Math.max(0, plane[p]! - lo) / scale) / Math.asinh(8))) : 0; + await sharp(bytes, { raw: { width: intensity.width, height: intensity.height, channels: 1 } }).flip().resize({ width: 800, withoutEnlargement: true }).png().toFile(stem + '.preview.png'); + const exported = { band, coadd, width: intensity.width, height: intensity.height, header: h, factorDnToMJySr: factor, absoluteZeroPointKnown: false, + calibration: { convention: 'constant Fnu photon-count equivalent; matches heating-grid flat-Fnu normalization', fnuZeroJy: FNU_ZERO[band], janskyPerDn: CONVERSION[band], reference: 'https://irsa.ipac.caltech.edu/data/WISE/docs/release/All-Sky/expsup/sec4_4h.html', table: 'Table1 column2; DN factor Fnu0*10^(-0.4*MAGZP)', standardAtlasJanskyPerDn: band === 3 ? 1.8326e-6 : 5.2269e-5, ratioToStandardAtlasFactor: CONVERSION[band] / (band === 3 ? 1.8326e-6 : 5.2269e-5), colorCorrection: 'none: compare directly to identically normalized synthetic band integrals; W4 red-source/RSR systematic remains' }, + sourceProducts: [ip, up, cp].map(p => ({ kind: p.kind, path: p.path, url: p.url, bytes: p.bytes })), + arrays: { order: 'row-major, original FITS stored rows; first row southern edge, RA decreases along x; no flip or resampling', type: 'little-endian float32', intensity: `${coadd}-w${band}.mjysr.f32`, uncertainty: `${coadd}-w${band}.uncertainty-mjysr.f32`, coverage: `${coadd}-w${band}.coverage.f32`, observed: `${coadd}-w${band}.observed.u8`, quality: `${coadd}-w${band}.quality.u8` }, + quality: { unknown, lowCoverageBelow6: lowCoverage, flagBits: { 1: 'nonfinite intensity/uncertainty/coverage, nonpositive uncertainty or zero coverage: unknown, not zero dust', 2: 'coverage below6; weak/outlier-vulnerable' }, perPixelArtifactMaskAvailable: false, saturation: 'NaN/zero-coverage holes detected; missed saturation can remain and is not excluded by finite values', compactSourcesRemoved: false }, + psf: { nativeDetectorFwhmArcsec: band === 3 ? 6.7 : 11.8, effectiveAtlasFwhmArcsec: band === 3 ? 9.5 : 16.8, atlasPixelArcsec: 1.375, suggestedCommonFwhmArcsec: 18, reference: 'AllWISE IV.4.l; global ballpark, actual local asymmetric PRF should be measured' }, + statisticsMJySr: sourceStats, uncertaintyStatisticsMJySr: statistics(sigma), coverageStatistics: statistics(cov), knownStars, + limitations: ['Relative diffuse excess only; unknown additive level per atlas tile', 'No SED color correction; PAH/VSG stochastic emission is not an equilibrium temperature or direct column', 'Atlas uncertainty pixels are correlated; raw sigma is not independent per-pixel likelihood', 'No point-source subtraction performed; supplied stars/catalogue must be handled separately; missing cores stay unknown', 'Preserved native cutout WCS; service changes CRPIX/dimensions only, no geometric resampling'] }; + await json(stem + '.export.json', exported); return exported; +} + +async function metadata(directory: string): Promise { + const url = 'https://irsa.ipac.caltech.edu/ibe/search/wise/allwise/p3am_cdd?POS=56.55,24.11&SIZE=1.8&INTERSECT=OVERLAPS&ct=csv'; + const bytes = await cached(join(ROOT, 'atlas-query.csv'), url, 2_000_000); + if (!bytes.toString('utf8').startsWith('in_row_id,')) throw Error('IBE metadata query returned non-CSV.'); + const query = "SELECT TOP 100000 designation,ra,dec,w3mpro,w3sigmpro,w3snr,w4mpro,w4sigmpro,w4snr,cc_flags,ph_qual,ext_flg,w3sat,w4sat FROM allwise_p3as_psd WHERE 1=CONTAINS(POINT('ICRS',ra,dec),CIRCLE('ICRS',56.55,24.11,1.05))"; + const catalogueUrl = 'https://irsa.ipac.caltech.edu/TAP/sync?' + new URLSearchParams({ REQUEST: 'doQuery', LANG: 'ADQL', FORMAT: 'csv', MAXREC: '100000', QUERY: query }); + try { const catalogue = await cached(join(ROOT, 'allwise-sources-complete.csv'), catalogueUrl, 12_000_000); if (!catalogue.toString('utf8').startsWith('designation,')) throw Error('Catalogue is not expected CSV.'); await json(join(ROOT, 'catalogue-query.json'), { success: true, path: 'allwise-sources-complete.csv', earlierTruncatedQuery: 'allwise-sources.csv (TOP10000; retained, not used)', url: catalogueUrl, bytes: catalogue.length, query, warning: 'Includes point sources and knots in nebulosity; catalogue presence alone is not grounds for deleting diffuse emission.' }); } + catch (error: unknown) { await json(join(ROOT, 'catalogue-query.json'), { success: false, url: catalogueUrl, error: String(error) }); } + await json(join(directory, 'request.json'), { centerIcrsDegrees: [56.55, 24.11], requestedPhotoDegrees: [1.2, .85], margin: 'full stage extends at least~0.2deg past optical footprint within native atlas coverage', atlasQueryUrl: url, coadds: ['0561p242_ac51', '0577p242_ac51'], release: 'AllWISE2013, W3/W4 cryogenic2010 observations', zeroPoint: 'relative diffuse intensity only; per-tile additive backgrounds uncalibrated', implementation: 'shared @cssearth/fits parser and native SIN WCS; no geometry, no optical image reads' }); +} +async function main(): Promise { + const mode = process.argv[2]; if (mode !== 'pilot' && mode !== 'full' && mode !== 'metadata') throw Error('Usage: node packages/telescope-cli/authoring/m45/wise.mts pilot|full|metadata'); + if (mode === 'metadata') { await metadata(ROOT); return; } + const directory = join(ROOT, mode); await mkdir(directory, { recursive: true }); + if (mode === 'full') { const pilot: unknown = JSON.parse(await readFile(join(ROOT, 'pilot', 'receipt.json'), 'utf8')); if (!record(pilot) || pilot.success !== true) throw Error('Full acquisition needs successful exact-code pilot.'); } + const start = performance.now(), regions: Region[] = mode === 'pilot' ? [{ coadd: '0561p242_ac51', center: [56.55, 24.11], size: '128pix' }] : [ + { coadd: '0561p242_ac51', center: [56.30, 24.12], size: '1.30,1.28deg' }, + { coadd: '0577p242_ac51', center: [57.20, 24.12], size: '.85,1.28deg' }, + ]; + const products: Product[] = []; + for (const region of regions) for (const kind of ['int', 'unc', 'cov'] satisfies Kind[]) { + const pair = await Promise.all(([3, 4] satisfies Band[]).map(band => acquire(directory, region, band, kind))); products.push(...pair); + } + const exports = []; + for (const region of regions) for (const band of [3, 4] satisfies Band[]) exports.push(await exportTriplet(directory, products, band, region.coadd)); + await metadata(directory); + const receipt = { success: true, signal: 'WISE_ACQUISITION_QUALIFIED', mode, products: products.map(({ header, stats, ...rest }) => rest), exports: exports.map(e => ({ band: e.band, coadd: e.coadd, width: e.width, height: e.height, factorDnToMJySr: e.factorDnToMJySr, quality: e.quality })), totalTransferredBytes: products.reduce((sum, p) => sum + p.bytes, 0), elapsedSeconds: (performance.now() - start) / 1000 }; + await json(join(directory, 'receipt.json'), receipt); console.log(JSON.stringify(receipt)); +} +await main(); diff --git a/site/build/prepare/world/pleiades-world-frame.test.mts b/site/build/prepare/world/pleiades-world-frame.test.mts new file mode 100644 index 00000000000..36d6e81d90f --- /dev/null +++ b/site/build/prepare/world/pleiades-world-frame.test.mts @@ -0,0 +1,15 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import { test } from 'node:test'; +import { requireRecord } from '@cssearth/core'; +import { parsePreparedWorldCameraFrame, parsePreparedWorldContextSummary, parsePreparedWorldSystem } from '@cssearth/objects'; + +test('the delivered Pleiades world row agrees with the selected detail frame', async () => { + const descriptor = requireRecord(JSON.parse(await readFile(new URL('../../../../src/objects/m45/object.json', import.meta.url), 'utf8'))); + const frame = parsePreparedWorldCameraFrame(requireRecord(descriptor.properties).worldFrame); assert.ok(frame); + const summary = parsePreparedWorldContextSummary(JSON.parse(await readFile(new URL('../../../../src/objects/observable-universe/prepared/world.json', import.meta.url), 'utf8'))); + const members = parsePreparedWorldSystem(JSON.parse(await readFile(new URL('../../../../src/objects/milky-way/prepared/members.json', import.meta.url), 'utf8')), summary, 'milky-way'); + const body = members.bodies.find(row => row.id === descriptor.id); assert.ok(body); + assert.equal(body.radiusM, frame.bodyRadiusM, 'a stale context radius prevents the real route from mounting'); + assert.deepEqual(body.positionM, frame.originM); +}); diff --git a/site/world/application/application-world-resources.mts b/site/world/application/application-world-resources.mts index d6db4c00fc8..c392f29dbc4 100644 --- a/site/world/application/application-world-resources.mts +++ b/site/world/application/application-world-resources.mts @@ -1,7 +1,8 @@ -import { IMAGE_MESH_SCHEMA, parseCatalogueProximity, bankCataloguePoints, parseDatasetBillboards, parseGalaxyBacking, parseCataloguePointBankDescriptor, parseDensityVolumeFrame, parseImageLayerBankDescriptor, parseObjectDescriptor, parsePlaneBankDescriptor } from '@cssearth/objects'; +import { IMAGE_MESH_SCHEMA, parseCatalogueProximity, bankCataloguePoints, bankOverlays, parseDatasetBillboards, parseGalaxyBacking, parseCataloguePointBankDescriptor, parseDensityVolumeFrame, parseImageLayerBankDescriptor, parseObjectDescriptor, parsePlaneBankDescriptor } from '@cssearth/objects'; import { loadGalaxyStationBackground } from '@cssearth/renderer/universe/galaxy-stations/galaxy-station-loader.ts'; import { DATASET_VISIBILITY } from '../../browser/runtime-policy.mts'; import { isRecord } from '@cssearth/core'; +import { loadPointTransmission } from '@cssearth/renderer/universe/points/point-transmission-transport.ts'; // Generated after the prepared dataset payloads are restored: text now, validated below. import datasetBillboardText from '../../prepared/prepared-dataset-billboards.json?raw'; import { createPreparedUniverse, loadPreparedCssVolume, loadPreparedPointAppearance, loadPreparedCssSurfaceShell, loadPreparedCssImageLayers, loadPreparedVolumeDatasets } from '@cssearth/renderer/universe'; @@ -178,7 +179,17 @@ export function loadApplicationUniverse(): Promise { if (!volumeDatasetIds.has(id)) throw new TypeError(`Unknown prepared volume dataset bank: ${id}.`); // The bank's index and its default dataset; another dataset's files are read when it is first selected. const set = await bankSet(id), payload = await loadPreparedVolumeDatasets(set.descriptor, set.transport, { resolve: path => set.resolve(path) }); + const transmissionFile = parseObjectDescriptor(set.descriptor).properties.pointTransmission; + if (transmissionFile !== undefined && (typeof transmissionFile !== 'string' || !/^[a-z0-9-]+\.bin$/u.test(transmissionFile))) + throw new TypeError('A prepared point transmission must name a bank-local binary file.'); + const pointTransmission = typeof transmissionFile === 'string' ? await loadPointTransmission(set.resolve(`prepared/${transmissionFile}`)) : undefined; + const residentStacks = parseObjectDescriptor(set.descriptor).properties.residentStacks; + if (residentStacks !== undefined && typeof residentStacks !== 'boolean') throw new TypeError('Prepared volume stack residency must be a boolean.'); return { payload, resolveResource: (path: string) => set.resolve(`prepared/${path}`), + ...(residentStacks === true ? { residentStacks } : {}), + ...(pointTransmission ? { pointTransmission } : {}), + overlayUrls: Object.fromEntries(Object.entries(bankOverlays(parseObjectDescriptor(set.descriptor))).map(([dataset, banks]) => + [dataset, banks.map(bank => set.resolve(`prepared/${bank}.bin`))])), // Published catalogues drawn through the bank, with its opacity (its descriptor's `cataloguePoints`). cataloguePointUrls: bankCataloguePoints(parseObjectDescriptor(set.descriptor)).map(bank => set.resolve(`prepared/${bank}.bin`)) }; }); diff --git a/src/objects/alcyone/inventory.json b/src/objects/alcyone/inventory.json index a1c5800ef86..2a218a6a85d 100644 --- a/src/objects/alcyone/inventory.json +++ b/src/objects/alcyone/inventory.json @@ -89,7 +89,7 @@ "location": "prepared", "filename": "runtime.json", "bytes": 66749, - "sha256": "6a9726de1af5b20120419a65e2647652355cb3330b01140eedae1049a1bd7fd5" + "sha256": "319c99ce42006c823b3c7d81eeb0cc82465b2fdecd4b51c24e7092fa88f76112" }, { "location": "prepared", diff --git a/src/objects/alcyone/object.json b/src/objects/alcyone/object.json index 9cb06bf8d95..27cc6d07c55 100644 --- a/src/objects/alcyone/object.json +++ b/src/objects/alcyone/object.json @@ -98,7 +98,7 @@ "name": "Alcyone", "classification": "star", "color": "#aec4ff", - "distanceAu": 27813035.7, + "distanceAu": 28196530.24164669, "description": "A star 124 parsecs away, 14 times the Sun's width, measured from its light.", "systemName": "Alcyone system", "aliases": [ @@ -117,9 +117,9 @@ "referenceFrame": "sun-icrf", "epochJdTt": 2461286.5, "originM": [ - 2075662777243036700, - 3180570654928602600, - 1699296598539222500 + 2104283553085837600, + 3224426719008438300, + 1722727758730775300 ], "presentationToReference": [ 0.4988649509752202, diff --git a/src/objects/alcyone/source/plane-placement.json b/src/objects/alcyone/source/plane-placement.json new file mode 100644 index 00000000000..26803a291cb --- /dev/null +++ b/src/objects/alcyone/source/plane-placement.json @@ -0,0 +1,14 @@ +{ + "generator": ".local/pleiades-star-placement.mts", + "kind": "adopted-plane", + "hip": 17702, + "referenceDirectionIcrsDegrees": [ + 56.67978318, + 24.10845447 + ], + "dustNormalDepthPc": 136, + "starNormalDepthPc": 136.7, + "radialDistancePc": 136.70063620969086, + "basis": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "preservedReferenceMeasurements": "source/measurements.json" +} diff --git a/src/objects/alcyone/source/preparation/new-object.json b/src/objects/alcyone/source/preparation/new-object.json index 47e0d363520..b3bcb192845 100644 --- a/src/objects/alcyone/source/preparation/new-object.json +++ b/src/objects/alcyone/source/preparation/new-object.json @@ -41,10 +41,9 @@ "uncertainty": 1.2 }, "distance": { - "value": 134.84134308, - "source": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Alcyone is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 123.609 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased", - "url": "https://doi.org/10.1051/0004-6361/202346285", - "uncertainty": 2.7 + "value": 136.70063620969086, + "source": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "url": "https://doi.org/10.1051/0004-6361/202346285" }, "color": { "skip": [], diff --git a/src/objects/celaeno/inventory.json b/src/objects/celaeno/inventory.json index 7adc0709591..6cc78642ffa 100644 --- a/src/objects/celaeno/inventory.json +++ b/src/objects/celaeno/inventory.json @@ -89,7 +89,7 @@ "location": "prepared", "filename": "runtime.json", "bytes": 66904, - "sha256": "9eb14843e406d82dd5c1e3a0e4f15bd1717d8665f47908c43408c49dd4c97bb9" + "sha256": "17917ba4b8d3a2071c0269a0f886d62a6f78bc3155955e94a794bdb8040ddc17" }, { "location": "prepared", diff --git a/src/objects/celaeno/object.json b/src/objects/celaeno/object.json index 7e3208ec2ee..05ca7fd7764 100644 --- a/src/objects/celaeno/object.json +++ b/src/objects/celaeno/object.json @@ -98,7 +98,7 @@ "name": "Celaeno", "classification": "star", "color": "#c2d2ff", - "distanceAu": 27813060.6, + "distanceAu": 28197358.5147201, "description": "A star about 140 parsecs away, 3.4 times the Sun's width, measured by Gaia.", "systemName": "Celaeno system", "aliases": [ @@ -118,9 +118,9 @@ "referenceFrame": "sun-icrf", "epochJdTt": 2461286.5, "originM": [ - 2109675344240683800, - 3151521160506691600, - 1711499340063356700 + 2138827910572887600, + 3195070481936705500, + 1735149707962203600 ], "presentationToReference": [ 0.5070385463781155, diff --git a/src/objects/celaeno/source/plane-placement.json b/src/objects/celaeno/source/plane-placement.json new file mode 100644 index 00000000000..b470a523d48 --- /dev/null +++ b/src/objects/celaeno/source/plane-placement.json @@ -0,0 +1,14 @@ +{ + "generator": ".local/pleiades-star-placement.mts", + "kind": "adopted-plane", + "hip": 17489, + "referenceDirectionIcrsDegrees": [ + 56.67978318, + 24.10845447 + ], + "dustNormalDepthPc": 136, + "starNormalDepthPc": 136.7, + "radialDistancePc": 136.7046517908677, + "basis": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "preservedReferenceMeasurements": "source/measurements.json" +} diff --git a/src/objects/celaeno/source/preparation/new-object.json b/src/objects/celaeno/source/preparation/new-object.json index 498c6e97ce4..ba737886b00 100644 --- a/src/objects/celaeno/source/preparation/new-object.json +++ b/src/objects/celaeno/source/preparation/new-object.json @@ -28,10 +28,9 @@ "uncertainty": 36.7 }, "distance": { - "value": 134.84134308, - "source": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Celaeno is a member, as its sisters are placed; its own Gaia DR3 parallax agrees to 0.6 pc, within the cluster's depth (half its members within 2.70 pc of the centre)", - "url": "https://doi.org/10.1051/0004-6361/202346285", - "uncertainty": 2.7 + "value": 136.7046517908677, + "source": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "url": "https://doi.org/10.1051/0004-6361/202346285" }, "color": { "skip": [ diff --git a/src/objects/m45-named-stars/README.md b/src/objects/m45-named-stars/README.md index 19be39faa2f..323f3904191 100644 --- a/src/objects/m45-named-stars/README.md +++ b/src/objects/m45-named-stars/README.md @@ -1,6 +1,6 @@ # Pleiades named stars -The nine stars of the Pleiades the IAU names, one bright dot each, drawn while the cluster is selected. Each sits where its label stands: Alcyone, Merope, Celaeno and Pleione have star objects of their own at the cluster's distance, and their dots sit at the same places. The cluster's other members are the [Pleiades members](../m45-members/README.md) bank's. +The nine stars of the Pleiades the IAU names, one bright dot each, drawn while the cluster is selected. The dust model places them at an **adopted normal depth of 136.7 pc**, 0.7 pc beyond the 136.0 pc dust reference. Their individual depths are not measured. Alcyone, Merope, Celaeno and Pleione's object placements use the same adopted plane so their labels and navigation remain with the stars. The cluster's other members are the [Pleiades members](../m45-members/README.md) bank's. ## Sources @@ -11,8 +11,9 @@ The nine stars of the Pleiades the IAU names, one bright dot each, drawn while t ## Processing -1. The table is a CDS TAP query (`source/dots/points.json`, `table.origin`; not tracked): the nine Hipparcos rows, with the cluster's distance written into each. -2. `node packages/bake/cli/prepare-catalogue-points.mts src/objects/m45-named-stars dots` places each star at its position and the cluster's distance, colors it by its B-V and tones it by its Hp magnitude on the member bank's scale, at the member bank's largest dot size ([recipe](source/dots/points.json)): 9 dots. +1. The original CDS TAP table (`source/dots/table.csv`; restored from the origin in the manifest) is preserved. It holds nine Hipparcos rows with the cluster's reference distance. +2. The [table generator](../../../packages/bake/authoring/m45/dust/acquisition/named-star-table.mts) derives `source/dots/modeled-table.csv`: radial distance = 136.7 pc divided by the star's sight-line cosine to the adopted plane normal. Measured RA, Dec, Hp and B−V remain unchanged. [plane-placement.json](source/plane-placement.json) states the reference direction and assumption. +3. Catalogue preparation retains photometric styles and writes geometry in local parsecs, at 0.0001 pc precision. The shared world-navigation preparation places the four star objects on the same adopted plane. Their published parallax and photometric-reference records remain separate, unchanged facts. Gaia DR3's member list leaves the brightest of them out (Alcyone, Merope, Taygeta) or outside its tidal-radius selection (Atlas, Electra, Pleione), so without this bank the cluster's brightest stars would not be drawn. The member bank leaves out the three it keeps, so none is drawn twice. @@ -21,10 +22,11 @@ Gaia DR3's member list leaves the brightest of them out (Alcyone, Merope, Tayget | Value | Kind | | --- | --- | | Positions, Hp and B-V | Measured: van Leeuwen (2007), Hipparcos | -| Distance 134.8 pc for each | Chosen: the cluster's measured distance (Hunt & Reffert 2023). No star's own parallax places it within the cluster better than the cluster's depth | +| Cluster reference distance 134.8 pc | Measured cluster statistic: Hunt & Reffert (2023), not an individual star depth | +| Normal depth 136.7 pc for every bright star | Adopted model assumption: 0.7 pc beyond the 136.0 pc dust reference. Radial distances differ slightly with sky position | | Color fit, tone scale, dot size | Presentation: the app's catalogue star color; the member bank's tone scale and largest size | ## Known problems -- Each star's depth within the cluster is chosen, not measured. +- Each star's depth within the cluster is chosen, not measured. The adopted geometry is not a fit of the bright-star parallaxes. - Atlas, Electra, Maia, Taygeta and Asterope have no star object, so they are drawn but not named. diff --git a/src/objects/m45-named-stars/inventory.json b/src/objects/m45-named-stars/inventory.json index d15f0cd2fed..de83d23cf80 100644 --- a/src/objects/m45-named-stars/inventory.json +++ b/src/objects/m45-named-stars/inventory.json @@ -4,8 +4,8 @@ { "location": "prepared", "filename": "dots.bin", - "bytes": 1209, - "sha256": "a137b04b317a54bf7b2e6ffab1e395f72fb49fa5394fa68d9a2e409f5ef601c8" + "bytes": 1297, + "sha256": "3ef066512554b9ace62bcc1e58f2ecccf643c734d493919d642998b9a05b2bda" } ] } diff --git a/src/objects/m45-named-stars/source/dots/points.json b/src/objects/m45-named-stars/source/dots/points.json index e1dcc096d82..bb0a5538711 100644 --- a/src/objects/m45-named-stars/source/dots/points.json +++ b/src/objects/m45-named-stars/source/dots/points.json @@ -3,9 +3,8 @@ "id": "dots", "published": true, "table": { - "path": "table.csv", - "origin": "https://tapvizier.cds.unistra.fr/TAPVizieR/tap/sync?REQUEST=doQuery&LANG=ADQL&FORMAT=csv&MAXREC=100000&QUERY=SELECT+HIP%2C+RArad%2C+DErad%2C+134.84134308+AS+distpc%2C+Hpmag%2C+%22B-V%22+FROM+%22I%2F311%2Fhip2%22+WHERE+HIP+IN+%2817702%2C17847%2C17499%2C17573%2C17608%2C17531%2C17851%2C17489%2C17579%29+ORDER+BY+Hpmag", - "bytes": 541, + "path": "modeled-table.csv", + "bytes": 577, "format": "csv", "columns": { "name": 1, @@ -13,7 +12,8 @@ "decDeg": 3, "distance": 4 }, - "distanceUnit": "pc" + "distanceUnit": "pc", + "generator": ".local/pleiades-star-placement.mts" }, "sample": "The nine stars of the Pleiades the IAU names (src/references/iau-star-names/iau-star-names.tsv), by their Hipparcos numbers: Alcyone (HIP 17702), Atlas (17847), Electra (17499), Maia (17573), Merope (17608), Taygeta (17531), Pleione (17851), Celaeno (17489) and Asterope (17579). Gaia DR3's member list leaves out the brightest of them, so the cluster's light is drawn without them unless they are drawn here.", "filters": [], @@ -24,7 +24,7 @@ "converter": "Astropy SkyCoord ICRS, heliocentric Cartesian" }, "source": "doi-10-1051-0004-6361-20078357", - "meaning": "The nine named stars of the Pleiades, one dot each at its Hipparcos position, at the cluster's distance, where the four that have star objects stand; drawn when the cluster is selected.", + "meaning": "Nine named Pleiades stars at measured Hipparcos sky positions and observed photometry, with adopted normal depth 136.7 pc. Individual stellar depths are assumed, not measured.", "appearance": { "colorCss": "#ffffff", "radiusPx": 2.6, @@ -47,5 +47,6 @@ "steps": 8, "basis": "The member bank's display scale (src/objects/m45-members/source/dots/points.json): each star's Hp magnitude minus the distance modulus of the cluster's distance darkens its color from full at -2 to 15% at +12, linear in magnitude. The dot size is the member bank's brightest tier, 2.6 px." } - } + }, + "generator": ".local/pleiades-star-placement.mts" } diff --git a/src/objects/m45-named-stars/source/manifest.json b/src/objects/m45-named-stars/source/manifest.json index 8155b110d18..11ff5f3506d 100644 --- a/src/objects/m45-named-stars/source/manifest.json +++ b/src/objects/m45-named-stars/source/manifest.json @@ -22,6 +22,22 @@ }, "dependencies": [], "license": "Original catalogue terms apply; cite the authors and CDS/VizieR." + }, + { + "id": "modeled-named-star-depths", + "path": "src/objects/m45-named-stars/source/dots/modeled-table.csv", + "generator": "packages/bake/authoring/m45/dust/acquisition/named-star-table.mts", + "title": "Adopted bright-star depths behind the Pleiades dust plane", + "credit": "Hipparcos sky positions and photometry with adopted bright-star depths.", + "acquisition": "Derived from the preserved original table by the generator. Every bright star has adopted normal depth 136.7 pc, 0.7 pc beyond the 136.0 pc dust reference. This is not measured stellar depth.", + "dependencies": [ + "named-stars" + ], + "sourceBinding": { + "kind": "local", + "reason": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate." + }, + "license": "Derived from the catalogue under its original terms; cite van Leeuwen (2007) and CDS/VizieR." } ], "documents": [ @@ -38,6 +54,13 @@ "kind": "local", "reason": "Project-authored processing configuration." } + }, + { + "path": "src/objects/m45-named-stars/source/plane-placement.json", + "sourceBinding": { + "kind": "local", + "reason": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate." + } } ], "generatedIntermediates": [] diff --git a/src/objects/m45-named-stars/source/plane-placement.json b/src/objects/m45-named-stars/source/plane-placement.json new file mode 100644 index 00000000000..f42e8508aec --- /dev/null +++ b/src/objects/m45-named-stars/source/plane-placement.json @@ -0,0 +1,69 @@ +{ + "generator": ".local/pleiades-star-placement.mts", + "kind": "adopted-plane", + "referenceDirectionIcrsDegrees": [ + 56.67978318, + 24.10845447 + ], + "dustNormalDepthPc": 136, + "starNormalDepthPc": 136.7, + "originalTable": "source/dots/table.csv", + "modeledTable": "source/dots/modeled-table.csv", + "basis": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "stars": [ + { + "hip": 17702, + "raDeg": 56.87110081, + "decDeg": 24.10524179, + "radialPc": 136.70063516878986 + }, + { + "hip": 17847, + "raDeg": 57.29054699, + "decDeg": 24.05352413, + "radialPc": 136.7065367711441 + }, + { + "hip": 17499, + "raDeg": 56.21884818, + "decDeg": 24.1134484, + "radialPc": 136.70368597750354 + }, + { + "hip": 17573, + "raDeg": 56.45663811, + "decDeg": 24.36785797, + "radialPc": 136.70226305939224 + }, + { + "hip": 17608, + "raDeg": 56.58150148, + "decDeg": 23.94846199, + "radialPc": 136.700700727146 + }, + { + "hip": 17531, + "raDeg": 56.30200903, + "decDeg": 24.46737906, + "radialPc": 136.7051510615877 + }, + { + "hip": 17851, + "raDeg": 57.29668416, + "decDeg": 24.13682556, + "radialPc": 136.70661717319712 + }, + { + "hip": 17489, + "raDeg": 56.20084225, + "decDeg": 24.28957701, + "radialPc": 136.70465660224318 + }, + { + "hip": 17579, + "raDeg": 56.4769331, + "decDeg": 24.55462133, + "radialPc": 136.7048560812914 + } + ] +} diff --git a/src/objects/m45-named-stars/source/presentation.json b/src/objects/m45-named-stars/source/presentation.json index 65fd0c3daa5..78d8d4348e9 100644 --- a/src/objects/m45-named-stars/source/presentation.json +++ b/src/objects/m45-named-stars/source/presentation.json @@ -5,8 +5,8 @@ { "id": "dots", "label": "The nine named Pleiades stars, Hipparcos new reduction, CDS I/311", - "process": "Keep the nine Hipparcos rows of the stars the IAU names in the Pleiades; place each at its Hipparcos position, at the cluster's distance; color by B-V and tone by Hp magnitude.", - "recipe": "source/dots/points.json", + "process": "Preserve Hipparcos sky coordinates, Hp and B-V; derive radial distances that place each star at adopted normal depth 136.7 pc, then reuse the existing prepared catalogue style and write its positions in local parsecs. Generator .local/pleiades-star-placement.mts; no individual star depth is measured.", + "recipe": "source/plane-placement.json", "selector": "", "inputs": [ "named-stars" @@ -19,8 +19,8 @@ "sourceKind": "published-catalogue" }, "limitations": [ - "Each star's depth is the cluster's distance, chosen, not measured: its own parallax is less certain than the cluster's depth.", - "Positions are Hipparcos's (epoch 1991.25); the stars have moved about 1 arcsecond since." + "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "Published stellar measurement records retain their reference distances and parallaxes separately from the adopted bright-star plane." ] } ] diff --git a/src/objects/m45/README.md b/src/objects/m45/README.md index 3f6784460c1..b95b5eec116 100644 --- a/src/objects/m45/README.md +++ b/src/objects/m45/README.md @@ -1,33 +1,32 @@ # Pleiades -The Pleiades as an object of the world: its place, its card and its list marker. It has no surface. Its one dataset shows the [Pleiades members](../m45-members/README.md) bank, with the [named stars](../m45-named-stars/README.md) bank beside it; their READMEs hold the catalogues' sources, processing and known problems. +The Pleiades is an open star cluster about 135 parsecs away, seen through the Milky Way dust cloud its brightest stars light up. Its dataset combines Gaia and Hipparcos stars with a [regional dust model](../milky-way-pleiades-dust/README.md). The link and search open from Earth's direction, framed on the cluster. -The Pleiades is drawn as the open star cluster it is. The blue reflection nebula seen around its brightest stars is dust of an unrelated cloud the cluster is passing through. It was drawn here on one authored depth surface through the middle of the cluster, a depth no measurement supports, and is no longer shown. Measured three-dimensional dust belongs to a model of the Milky Way's dust, not to the cluster. ## Sources -| Source | Measurement used | -| --- | --- | -| [Hunt & Reffert (2023), A&A 673, A114](https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114) | The cluster's position, distance (dist50 134.8 pc), radial velocity (5.34 km/s, 398 members), age (logAge50 8.08), the radius holding half its members (2.70 pc) and the tidal radius it is framed at (11.1 pc), Table 3, Melotte_22. | - -The Gaia distance agrees with the independent radio parallax of [Melis et al. (2014)](https://arxiv.org/abs/1408.6544), 136.2 ± 1.2 pc, to about one standard error. - -## Processing - -1. The [astronomy record](../../../packages/astronomy/data/bodies/m45.json) places the cluster from Hunt & Reffert's position and distance. -2. `node packages/bake/cli/prepare-object.mts m45` prepares its scene through the standard authored lane. The [recipe](object.json) declares no surface, so the scene is the camera, sky and world frame; the page frames the cluster at its tidal radius estimate, 11.1 pc, a presentation value ([solar-system.json](source/presentation/solar-system.json)). -3. `node site/build/prepare/companion-context.mts m45` draws the list marker from the member dots. +- [Hunt & Reffert (2023)](https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114), Table 3, Melotte_22: position, distance of 134.8 pc, age and member selection. The [card record](source/content/object.json) cites each fact; the [astronomy record](../../../packages/astronomy/data/bodies/m45.json) places the cluster. +- [Hipparcos named stars](../m45-named-stars/README.md): nine bright stars supplement the Gaia member list. Four have matching navigable star objects. Their adopted normal depth is 136.7 pc; individual bright-star distances are not measured by this model. +- [Dust sources and processing](../milky-way-pleiades-dust/README.md): member reddening and Gaia constrain placement near 136 pc; Edenhofer and Leike constrain broad depth structure; infrared emission supplies finer structure. Published B-star parameters and Draine grains supply the lighting. ## Evidence -![The Pleiades in the app, about 18 pc from the cluster: the member dots, the nine named stars as the largest blue dots, and Alcyone, Merope and Celaeno named on theirs](evidence/2026-10-11/views.jpg) - -Captured 2026-10-11 at http://127.0.0.1:4215/m45/, five wheel steps closer than the opening view. Each named star's label stands on its dot. Pleione's label is held back by crowding beside Alcyone at this distance. +- The renderer path retains 94 dust elements (88 foreground elements and six panorama faces) through 181 one-degree camera poses, with fixed images and lighting and projection error below 0.071 px. +- Device and GPU-rendered images cover the Earth, side, rear and inside views. Images and timing results are attached to the [pull request](https://github.com/layoutit/css.earth/pull/1599). +- On a Galaxy S23, dust reduces continuous-drag delivery by about 10–14 fps across the opening, oblique and inside views. Coast differences range from −0.26 to +0.70 fps near 59 fps. Both dust-on and dust-off traces contain dropped or partial frames; tile memory remains below the recorded limits. ## Known problems -- The framing radius is a presentation value: Hunt & Reffert give the tidal radius as an approximate estimate. -- The Milky Way's open-cluster dots still draw this cluster as one dot of their own. -- The nine named stars are drawn as bright dots by the [named-stars bank](../m45-named-stars/README.md), at the cluster's distance. Alcyone, Merope, Celaeno and Pleione are also named star objects, inside the cluster, at the same places. Alcyone, Merope and Pleione's own parallaxes, from the Hipparcos era, put them 11 to 18 pc nearer, the bias the cluster's distance controversy exposed; their published radii are scaled to the cluster's distance. Celaeno's Gaia DR3 distance differs from the cluster's by 0.6 pc. -- Atlas, Electra, Maia, Taygeta and Asterope have no star object, so they are drawn but not named. -- The member dots are sized and toned by magnitude, a display scale: the brightest 3% are the B and early A stars. +- Drag slowdown is GPU-side and its cause is unresolved. Recorded command-buffer flushes take 22–50 ms during input; one 150 ms presentation gap includes a 131 ms flush and 44 ms of concurrent main-thread work. +- On an iPad, mean RAF drag pacing is about 4 fps below dust off. Opening-view coast averages 45.95 fps against 56.77 fps without dust, with substantial variation. RAF gaps are not hardware dropped-frame counts. +- Native iPad screens show faint straight-edged dark boundaries in the Earth view; the visual seam check remains open. +- Cloud thickness, tilt, individual filament distances and absolute infrared-derived dust mass are uncertain. The adopted bright-star plane is a modeling assumption. +- Lighting stays fixed to Earth's view rather than changing with the observer. Near elements are finite billboards; a large element can clip visible support at its center plane on the opposite phone orbit, and inside-cloud views are approximate. +- Atlas, Electra, Maia, Taygeta and Asterope are drawn without navigable star objects. The Milky Way open-cluster bank also represents the cluster with a single dot. + +## Processing + +1. The standard authored preparation reads the [recipe](object.json), which declares no surface. The scene supplies the camera, sky and world frame. +2. The members dataset mounts the star banks and regional dust together. Its 3.6 pc [framing radius](source/presentation/solar-system.json) is a presentation value, distinct from the catalogue's approximate 11.1 pc tidal radius. +3. The foreground cloud has fixed 3D positions and prepared images. Lighting is calculated from Earth's direction and stays fixed while the camera turns. Faint surrounding cirrus and stellar dimming use the same underlying dust field. +4. The shared companion-context preparation draws the list marker from the member stars. [Dust preparation](../../../packages/bake/authoring/m45/dust/README.md) supplies the separate regional bank. diff --git a/src/objects/m45/inventory.json b/src/objects/m45/inventory.json index 548b9ee55d3..cc9f2f8562b 100644 --- a/src/objects/m45/inventory.json +++ b/src/objects/m45/inventory.json @@ -4,8 +4,8 @@ { "location": "public", "filename": "m45-dataset-members.webp", - "bytes": 1026, - "sha256": "e405c0d79c9dd8f5d55fb5485a0a94d3cadc3a41aca0d22643cc668657fec8cf" + "bytes": 20924, + "sha256": "3ecf947bd0ef347d8d6ae2479cd174dd03b3596910cb65818bfaa853a66c3ca6" }, { "location": "prepared", @@ -16,26 +16,26 @@ { "location": "prepared", "filename": "datasets.json", - "bytes": 541, - "sha256": "ccbc0324a347089093c8fe2331765c8af8b30b0d228c0b3880273630fd365dc2" + "bytes": 558, + "sha256": "8f365ab2aab72dafcc9bf1fb1df5668f4f2a4b3f20364d001630a42c638e20d3" }, { "location": "prepared", "filename": "members.json", "bytes": 1127, - "sha256": "7ac16efddb9344e6a5a62dfcb2aa0696376a8006655709a1e03f2e1441b1a263" + "sha256": "38b8fb7396c338bf56b464da2d1e320e5b101f72a56ada55bd6abfec89e12b69" }, { "location": "prepared", "filename": "runtime.json", - "bytes": 4632, - "sha256": "bb781279efbc3b2334371e308aede38efe0784a58f28bdf39d433c27f613855c" + "bytes": 4646, + "sha256": "f5c0b2a48f96dd99a9d5a47c1fe6df3cfcd7a504066c21634d22eef7f6e2212c" }, { "location": "prepared", "filename": "text.json", - "bytes": 1781, - "sha256": "6b44e476716729202bf4aabed8efe5d750b3ee347a11f3671b4ed9b46602836d" + "bytes": 6455, + "sha256": "ee2e32216015fc47cba2e9e76eb6efafc16c0acabbddb30d44cafc363b94aa24" } ] } diff --git a/src/objects/m45/object.json b/src/objects/m45/object.json index 973b0870206..e45e8f32252 100644 --- a/src/objects/m45/object.json +++ b/src/objects/m45/object.json @@ -23,7 +23,7 @@ "surfaces": [], "shape": { "kind": "sphere", - "radiusKm": 342813388933523.75 + "radiusKm": 111084392933689.22 }, "sources": [ { @@ -88,8 +88,8 @@ -0.3977771559319137, 0.9174820620691818 ], - "metersPerUnit": 1105849641721044.5, - "bodyRadiusM": 342813388933523800 + "metersPerUnit": 358336751398997.5, + "bodyRadiusM": 111084392933689220 } }, "prepared": { diff --git a/src/objects/m45/source/content/object.json b/src/objects/m45/source/content/object.json index 9a1d9d98a7e..bde9cd3d026 100644 --- a/src/objects/m45/source/content/object.json +++ b/src/objects/m45/source/content/object.json @@ -69,17 +69,17 @@ "controls": [ { "id": "members", - "label": "Gaia DR3 members", + "label": "Stars and dust", "thumbnail": "m45-dataset-members.webp", "volume": { - "objectId": "m45-members", - "datasetId": "members", + "objectId": "milky-way-pleiades-dust", + "datasetId": "smooth-dust", "surface": "members" }, "source": { - "id": "m45-members", - "path": "../../m45-members/source/manifest.json", - "url": "https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114" + "id": "milky-way-pleiades-dust", + "path": "../../milky-way-pleiades-dust/source/manifest.json", + "url": "https://zenodo.org/records/10658339" }, "falseColor": false } diff --git a/src/objects/m45/source/presentation/solar-system.json b/src/objects/m45/source/presentation/solar-system.json index 1435d802a99..a5fafcc7086 100644 --- a/src/objects/m45/source/presentation/solar-system.json +++ b/src/objects/m45/source/presentation/solar-system.json @@ -3,7 +3,7 @@ "bodyId": "m45", "displayName": "Pleiades", "bodyRadiusUnits": 248, - "bodyRadiusKilometers": 342813388933523.75, + "bodyRadiusKilometers": 111084392933689.22, "defaultZoom": 1.25, "geometryScale": 1.25 } diff --git a/src/objects/m45/text.json b/src/objects/m45/text.json index 295c938ef72..340c1c0d224 100644 --- a/src/objects/m45/text.json +++ b/src/objects/m45/text.json @@ -14,22 +14,64 @@ ] }, "introduction": { - "text": "The Pleiades is drawn as 1,020 of its member stars, measured by Gaia and, for its nine named stars, by Hipparcos; each dot sits at its sky position, at the cluster's distance.", + "text": "The Pleiades is an open star cluster about 135 parsecs away, seen through the Milky Way dust cloud its brightest stars light up.", "sources": [ { "catalogueId": "hunt-reffert-2023-open-clusters", "url": "https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114", - "label": "Hunt & Reffert (2023), A&A 673, A114; CDS J/A+A/673/A114, Table members, Melotte_22: members inside the tidal radius (inrt) with a Gaia DR3 color", + "label": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50, the median of the maximum-likelihood distance, 134.84134308 pc (16th to 84th percentile 134.82 to 134.86)", "checked": "2026-10-10", - "locator": "Melotte_22: 1,014 members inside the tidal radius with a color" + "locator": "Melotte_22: dist50 134.8 pc" + }, + { + "catalogueId": "edenhofer-2024-dust-map", + "url": "https://zenodo.org/records/10658339", + "label": "Edenhofer et al. (2024), A&A 685, A82: Galactic 3D dust map", + "checked": "2026-10-27", + "locator": "Dataset v1.0.2; native HEALPix density and radial profiles constrain broad structure and depth. Profile widths include reconstruction uncertainty." + }, + { + "catalogueId": "draine-2021-mmmp-isrf", + "url": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "label": "Modified MMP solar-neighborhood interstellar radiation field, U = 1", + "checked": "2026-10-25", + "locator": "Draine et al. (2021), ApJ 917, 3, section 2.1; unreddened U = 1 table, 2,500 wavelengths; λuλ in erg/cm³; optical I/V/B mean intensities sampled without amplitude fitting." + }, + { + "catalogueId": "allwise-pleiades-infrared", + "url": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "label": "AllWISE Atlas W3/W4 imaging of the Pleiades", + "checked": "2026-10-25", + "locator": "Tiles 0561p242_ac51 and 0577p242_ac51; intensity, uncertainty and coverage, processed at a common 18 arcsec resolution." + }, + { + "catalogueId": "spitzer-mips-pleiades-58", + "url": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "label": "Spitzer MIPS Pleiades program 58, AORs 8798976 and 8798720", + "checked": "2026-10-25", + "locator": "MIPS 24/70 µm PBCD intensity, uncertainty and coverage; 70 µm scan stripes excluded from fine column inference." + }, + { + "catalogueId": "gibson-nordsieck-2003-pleiades-photometry", + "url": "https://doi.org/10.1086/374589", + "label": "Gibson & Nordsieck (2003), Pleiades wide-field optical photometry", + "checked": "2026-10-25", + "locator": "Section 3.4, Figures 7–9; 5 × 1.7 degree BJ mosaic, centered at 4,400 Å. General nebula: 22.1–22.9 B mag/arcsec²; surrounding structures: 24.2–25.4; near 1 degree: 25.0. Common sky-zero uncertainty: 25.6 mag/arcsec². Regional ranges, not matched apertures." + }, + { + "catalogueId": "iras-iris-100um-pleiades", + "url": "https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties", + "label": "IRIS IRAS 100 µm numeric HiPS cutout around the Pleiades", + "checked": "2026-10-25", + "locator": "ivo://ov-gso/P/IRIS/4; 10 degree TAN field, 512 × 512 pixels, RA 56.68°, Dec 24.108°. MJy/sr from provider properties; 4.3 arcmin beam. Relative beam-scale structure only; no supplied quality or uncertainty arrays." } ] }, "datasets": { "members": { - "title": "Hunt & Reffert 2023 members", + "title": "Pleiades stars and dust", "detail": "1,020 stars", - "summary": "One dot per member star inside the tidal radius, in its Gaia color. Its depth in the cluster is assumed, not measured.", + "summary": "Gaia and Hipparcos stars with an infrared dust model. Depth is inferred; light stays fixed to Earth's view.", "sources": [ { "catalogueId": "hunt-reffert-2023-open-clusters", @@ -37,6 +79,48 @@ "label": "Hunt & Reffert (2023), A&A 673, A114; CDS J/A+A/673/A114, Table members, Melotte_22: members inside the tidal radius (inrt) with a Gaia DR3 color", "checked": "2026-10-10", "locator": "Melotte_22, inrt = True" + }, + { + "catalogueId": "edenhofer-2024-dust-map", + "url": "https://zenodo.org/records/10658339", + "label": "Edenhofer et al. (2024), A&A 685, A82: Galactic 3D dust map", + "checked": "2026-10-27", + "locator": "Dataset v1.0.2; native HEALPix density and radial profiles constrain broad structure and depth. Profile widths include reconstruction uncertainty." + }, + { + "catalogueId": "draine-2021-mmmp-isrf", + "url": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "label": "Modified MMP solar-neighborhood interstellar radiation field, U = 1", + "checked": "2026-10-25", + "locator": "Draine et al. (2021), ApJ 917, 3, section 2.1; unreddened U = 1 table, 2,500 wavelengths; λuλ in erg/cm³; optical I/V/B mean intensities sampled without amplitude fitting." + }, + { + "catalogueId": "allwise-pleiades-infrared", + "url": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "label": "AllWISE Atlas W3/W4 imaging of the Pleiades", + "checked": "2026-10-25", + "locator": "Tiles 0561p242_ac51 and 0577p242_ac51; intensity, uncertainty and coverage, processed at a common 18 arcsec resolution." + }, + { + "catalogueId": "spitzer-mips-pleiades-58", + "url": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "label": "Spitzer MIPS Pleiades program 58, AORs 8798976 and 8798720", + "checked": "2026-10-25", + "locator": "MIPS 24/70 µm PBCD intensity, uncertainty and coverage; 70 µm scan stripes excluded from fine column inference." + }, + { + "catalogueId": "gibson-nordsieck-2003-pleiades-photometry", + "url": "https://doi.org/10.1086/374589", + "label": "Gibson & Nordsieck (2003), Pleiades wide-field optical photometry", + "checked": "2026-10-25", + "locator": "Section 3.4, Figures 7–9; 5 × 1.7 degree BJ mosaic, centered at 4,400 Å. General nebula: 22.1–22.9 B mag/arcsec²; surrounding structures: 24.2–25.4; near 1 degree: 25.0. Common sky-zero uncertainty: 25.6 mag/arcsec². Regional ranges, not matched apertures." + }, + { + "catalogueId": "iras-iris-100um-pleiades", + "url": "https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties", + "label": "IRIS IRAS 100 µm numeric HiPS cutout around the Pleiades", + "checked": "2026-10-25", + "locator": "ivo://ov-gso/P/IRIS/4; 10 degree TAN field, 512 × 512 pixels, RA 56.68°, Dec 24.108°. MJy/sr from provider properties; 4.3 arcmin beam. Relative beam-scale structure only; no supplied quality or uncertainty arrays." } ] } diff --git a/src/objects/merope/inventory.json b/src/objects/merope/inventory.json index 3cbfecc180f..a95c0e40c18 100644 --- a/src/objects/merope/inventory.json +++ b/src/objects/merope/inventory.json @@ -88,8 +88,8 @@ { "location": "prepared", "filename": "runtime.json", - "bytes": 66869, - "sha256": "ae0a8d313da82789377307c9d46ce5d4c8c9000d2c0f502ff33f1f0a9adf15e9" + "bytes": 66871, + "sha256": "144f78421344ba73d6e3c817e028ab17a63ef212451a7301ff49f584b2f37c9f" }, { "location": "prepared", diff --git a/src/objects/merope/object.json b/src/objects/merope/object.json index 3dfc96140ca..171cc19e097 100644 --- a/src/objects/merope/object.json +++ b/src/objects/merope/object.json @@ -98,7 +98,7 @@ "name": "Merope", "classification": "star", "color": "#b1c6ff", - "distanceAu": 27813037.5, + "distanceAu": 28196543.867503747, "description": "A star 117 parsecs away, 7.7 times the Sun's width, measured from its light.", "systemName": "Merope system", "aliases": [ @@ -117,9 +117,9 @@ "referenceFrame": "sun-icrf", "epochJdTt": 2461286.5, "originM": [ - 2094264504041906400, - 3173914199274794000, - 1688887702093939500 + 2123142798401653000, + 3217680031309102600, + 1712176162604709400 ], "presentationToReference": [ 0.5033350990315865, diff --git a/src/objects/merope/source/plane-placement.json b/src/objects/merope/source/plane-placement.json new file mode 100644 index 00000000000..cbb8fddbc1c --- /dev/null +++ b/src/objects/merope/source/plane-placement.json @@ -0,0 +1,14 @@ +{ + "generator": ".local/pleiades-star-placement.mts", + "kind": "adopted-plane", + "hip": 17608, + "referenceDirectionIcrsDegrees": [ + 56.67978318, + 24.10845447 + ], + "dustNormalDepthPc": 136, + "starNormalDepthPc": 136.7, + "radialDistancePc": 136.70070226971004, + "basis": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "preservedReferenceMeasurements": "source/measurements.json" +} diff --git a/src/objects/merope/source/preparation/new-object.json b/src/objects/merope/source/preparation/new-object.json index 5da7d176bd2..c3d6ba1a86a 100644 --- a/src/objects/merope/source/preparation/new-object.json +++ b/src/objects/merope/source/preparation/new-object.json @@ -41,10 +41,9 @@ "uncertainty": 2 }, "distance": { - "value": 134.84134308, - "source": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Merope is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 116.55 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased", - "url": "https://doi.org/10.1051/0004-6361/202346285", - "uncertainty": 2.7 + "value": 136.70070226971004, + "source": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "url": "https://doi.org/10.1051/0004-6361/202346285" }, "planets": [], "companions": [], diff --git a/src/objects/milky-way-pleiades-dust/README.md b/src/objects/milky-way-pleiades-dust/README.md new file mode 100644 index 00000000000..e12ad6116a4 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/README.md @@ -0,0 +1,56 @@ +# Pleiades dust + +A regional Milky Way dust model selected by the [Pleiades dataset](../m45/README.md). Infrared-constrained foreground structure scatters the cluster's light, while the surrounding cloud is faintly lit by Galactic starlight. The full density field dims and reddens stars behind it. One prepared dataset serves every device. + + +## Sources + +| Input | Source and meaning | +| --- | --- | +| Cluster distance and members | [Hunt & Reffert (2023)](https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114), Gaia DR3 cluster catalogue. | +| Foreground placement | [Breger (1986)](https://adsabs.harvard.edu/pdf/1986ApJ...309..311B) member reddenings and [Gaia DR3](https://doi.org/10.1051/0004-6361/202243940) astrometry; the [placement constraint](source/placement-constraint.json) records sample cuts and uncertainty. | +| Broad density and depth | [Edenhofer et al. (2024), dataset v1.0.2](https://zenodo.org/records/10658339), native HEALPix density resampled at 1 pc over a 190 × 200 × 200 pc region; [Leike et al. (2020)](https://doi.org/10.1051/0004-6361/202038169) supplies an independent depth comparison. | +| Fine infrared structure | [AllWISE Atlas](https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/) 12/22 µm intensity, uncertainty and coverage; [Spitzer MIPS](https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/) program 58, AORs 8798976 and 8798720, at 24/70 µm. Fine inputs share an approximately 18 arcsec beam; striped 70 µm data supply only a 180 arcsec check. | +| Wide infrared structure | [IRIS 100 µm](https://doi.org/10.1086/427938), through [IRAP/CADE](https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties): a 10° field with a 4.3 arcmin beam, without companion pixel uncertainties. | +| Stellar light and grains | [White et al. (2017), Table 1](https://doi.org/10.1093/mnras/stx1050) temperatures, radii and masses; [Draine grain data](https://www.astro.princeton.edu/~draine/dust/dustmix.html) for wavelength-dependent extinction, albedo and Henyey–Greenstein asymmetry. These are diffuse-ISM model properties, not local optical grain measurements. | +| Galactic light | [Draine et al. (2021)](https://doi.org/10.3847/1538-4357/abff51), published modified-MMP radiation field at U = 1, from the [author's table](https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz). Its amplitude is fixed. | +| Cavity physics | [Artymowicz & Clampin (1997)](https://doi.org/10.1086/304889), [Katushkina & Izmodenov (2019)](https://arxiv.org/abs/1904.07760): radiation-pressure avoidance in an incoming dust flow. Per-star cavity sizes are modeled. | +| Optical checks | [Gibson & Nordsieck (2003), Paper I, §3.4](https://doi.org/10.1086/374589), regional B-band brightness; [NOIRLab/NSF/AURA, Rector, Cool and WIYN](https://www.astropix.org/image/noirlab/noao-m45), registered B/V/I image, CC BY 4.0. Optical images check the result; they do not supply density or texture. | + +The [manifest](source/manifest.json) binds the inputs; [parameters](source/parameters.json) define the display and reference camera, and [depth profiles](source/depth-profiles.json) preserve the registered numerical samples. The astronomy and infrared measurements constrain the model; they do not uniquely reconstruct its three-dimensional dust distribution. + +## Evidence + +- A 181-pose renderer path retains all 94 dust elements (88 foreground elements and six panorama faces), fixed images and lighting, with projection error below 0.071 px. +- Atlas checks preserve alpha and active RGB, and reject removal of gutters, edge dilation or exact encoding. The 1680 × 1512 atlas is 303,784 bytes; those are storage measurements, not GPU residency. +- Independent sampling of 530,964 panorama edge/corner rays finds no lost coverage, with luma RMS residual 0.136/255 and maximum 1.635/255 after texture interpolation. +- [Rendered views and device timing](https://github.com/layoutit/css.earth/pull/1599) cover the Earth, side, rear and inside views. Physical Galaxy S23 drag is about 10–14 fps below dust off; coast is approximately at parity. iPad drag is about 4 fps below dust off, with variable coast slowdown. Tile-memory and layer-area counts are separate from frame delivery. + +## Known problems + +- Both dust-on and dust-off S23 traces contain dropped or partial reporter records. These overlapping records are not unique missed frames. Safari exposes RAF pacing here, not displayed-frame drops; no zero-drop claim is supported. +- Native iPad screens show faint straight-edged dark boundaries in the Earth view. +- The GPU-side drag slowdown is unresolved. Command-buffer flushes take 22–50 ms during input, including a recorded 131 ms flush in a 150 ms presentation gap. +- A large near element can clip visible support at its center plane on the opposite phone orbit. Inside views, billboard ordering and representative positions are approximate. +- Earth-reference lighting stays fixed as the observer moves; side and rear views do not recalculate the physical scattering phase or outgoing extinction. A single alpha also cannot reproduce three spectral transmittances exactly. +- Infrared heating and column are degenerate near hot stars. Absolute dust mass, physical thickness, tilt and individual filament depths remain uncertain; the adopted foreground boundary is not a measured sharp cloud edge. +- The finite region is a data boundary, not the end of Galactic dust. The panorama approximates nearby ambient dust as distant sky. +- Asset setup restores the display. The source restore separately downloads preserved registered infrared columns, extinction grids and numerical inputs; re-extracting the native survey products additionally requires their acquisition tools. + +## Processing + +1. Normalize infrared structure to the broad extinction column. The surrounding IRIS structure is divided by an adopted equilibrium-grain heating model and normalized over roughly 1 pc. Near hot stars, infrared intensity reflects heating as well as column; the absolute conversion to dust mass remains uncertain. Missing 36 arcsec stellar cores are conditionally interpolated. +2. Distribute the fine column along native Edenhofer profiles with one global −0.766 pc registration to the 136 pc placement constraint. Apply luminosity-scaled radiation-pressure cavities. Per-sight-line normalization preserves the redistributed column; the finer density replaces the same partition of the coarse field. +3. Select existing foreground material between Earth and the adopted illuminating-star plane. Local coordinates are parsecs east, north and away from Earth, with z = normal depth − 136 pc. Earth is [0, 0, −136] pc; illuminating stars have adopted z = 0.7. Cluster reflection uses −136 < z < 0.7, without moving other material forward or renormalizing the selected column. +4. Calculate single scattering once from Earth's reference direction: inverse-square B-star light, wavelength-dependent albedo and phase function, incident and outgoing extinction, and the shielded Galactic field. Default B/V/I albedos are approximately 0.665/0.677/0.654, with g approximately 0.566/0.542/0.437. Six incoming directions approximate shielding of the isotropic Galactic field. Multiple scattering is omitted. +5. Prepare 88 fixed foreground elements through the shared cloud-points system. Each keeps the same position, image and lighting from every camera direction. The remaining density contributes only Galactic illumination, integrated into six fixed panorama faces. Full-field stellar transmission retains its spatial coordinates. +6. Pack the near images with four-pixel gutters, transparent-edge RGB dilation and exact lossless WebP. Extend panorama faces by four native texels, with normalized optical-depth feathering at overlaps and transparent outer edges. Source-over composition never adds light; camera motion only projects the prepared elements. + +The panorama's 100,000 pc display radius is a background approximation, not a measured dust distance. The regional visibility radius, 307.762 pc, encloses the physical map bounds independently of the Pleiades camera frame. + +## Measured and assumed + +- The placement fit uses 91 published reddenings and 39 quality-selected members. Its conditional center is 136.0 pc, with a 68% interval of 135.25–136.50 pc and a 95% interval of 132.25–137.75 pc. The selected members' median formal distance error is 0.37 pc; that precision does not apply to the bright illuminators. +- Edenhofer profile widths of about 5.3–6.9 pc and Leike widths of 2.2–3.8 pc include smoothing and posterior uncertainty. Their peaks differ by roughly 5 pc. Neither resolves two closely spaced scattering layers or measures true cloud thickness. +- Bright-star normal depths of 136.7 pc, blackbody spectra, grain sizes and weights, momentum efficiency Qpr = 1, incoming flow and ±1 km/s dispersion are adopted assumptions. Separate-star cavities approximate a multi-star flow; gas drag and magnetic coupling are omitted. +- The optical g ≈ 0.542 value is the Draine model. [Gibson & Nordsieck (2003), Paper II](http://physics.wku.edu/~gibson/offprints/gibson_2003_pleiades_scat_color.pdf)'s g ≈ 0.74 result applies to ultraviolet wavelengths below 260 nm, not a measured optical value. diff --git a/src/objects/milky-way-pleiades-dust/inventory.json b/src/objects/milky-way-pleiades-dust/inventory.json new file mode 100644 index 00000000000..37519162d31 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/inventory.json @@ -0,0 +1,89 @@ +{ + "schema": "cssearth-inventory@1", + "assets": [ + { + "location": "public", + "filename": "dust-preview.png", + "bytes": 20924, + "sha256": "3ecf947bd0ef347d8d6ae2479cd174dd03b3596910cb65818bfaa853a66c3ca6" + }, + { + "location": "prepared", + "filename": "cirrus/nx.webp", + "bytes": 6642, + "sha256": "aa67c1828ca4b800f4253faa44de43c77139948e32094c1ec57774077b41db40" + }, + { + "location": "prepared", + "filename": "cirrus/ny.webp", + "bytes": 9034, + "sha256": "40b087a3945844470dc08c5bd72791445d0f3e8b21eea02ff92225e1a7913c20" + }, + { + "location": "prepared", + "filename": "cirrus/nz.webp", + "bytes": 5272, + "sha256": "1481f9ff11e2ceb1947fecee372ad4139c524019bf8350d93cc4d807541261c9" + }, + { + "location": "prepared", + "filename": "cirrus/px.webp", + "bytes": 12112, + "sha256": "eb026610b6014715c116b705c16221fc4bfc9bc5d3a1ae17054310b67104cf16" + }, + { + "location": "prepared", + "filename": "cirrus/py.webp", + "bytes": 11770, + "sha256": "c7453577c1be89b2bfc45b98bfebcf8af75cc48e1fc94b4fdd117aa0103811fd" + }, + { + "location": "prepared", + "filename": "cirrus/pz.webp", + "bytes": 17496, + "sha256": "fd0ef7dbbe726f5fc29de36a9c4be9dd882b3cf2bbd0a1c410f1796e4e92dabc" + }, + { + "location": "prepared", + "filename": "datasets.json", + "bytes": 1232, + "sha256": "411cbfa3a388f2f68ddbfc9fed4b596b38be7a08dd9d335ed2221c1a43b14733" + }, + { + "location": "prepared", + "filename": "foreground-cloud-atlas.webp", + "bytes": 303784, + "sha256": "0518744e9ab98e806938079d9cb033dea362c8fd0abb779534e06e30b73f03e7" + }, + { + "location": "prepared", + "filename": "foreground-cloud.bin", + "bytes": 3219, + "sha256": "dfb9593f8ceb57a906a4539a961029639ca5dc2b7fe1e20ecc06534e45258e99" + }, + { + "location": "prepared", + "filename": "point-transmission.bin", + "bytes": 8030181, + "sha256": "78fbd10af57e95ae72358c2913d11a194714a404b33d2ddaa9ef7b8b27969012" + }, + { + "location": "prepared", + "filename": "presentation.json", + "bytes": 768, + "sha256": "44f451f37dbc06c64b3273d4bd46b6a0cf245b6986dbbacd61a8cd4521f53b68" + }, + { + "location": "prepared", + "filename": "smooth-dust/volume.json", + "bytes": 3731, + "sha256": "e23474d72a80f5e5db880addee183e613fed8b54fac094d2898808c6fe02869f" + }, + { + "location": "prepared", + "filename": "stars.bin", + "bytes": 438, + "sha256": "eb8cdb543e984af443348e3f1c50fdf7c4e78c29ef6f4a8f4f180ebafd411a2d" + } + ] +} diff --git a/src/objects/milky-way-pleiades-dust/object.json b/src/objects/milky-way-pleiades-dust/object.json new file mode 100644 index 00000000000..d115c895f8b --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/object.json @@ -0,0 +1,50 @@ +{ + "schema": "cssearth-object@2", + "id": "milky-way-pleiades-dust", + "type": "volume-dataset-bank", + "properties": { + "frame": { + "referenceFrame": "sun-icrf", + "epochJdTt": 2461286.5, + "originM": [ + 2104147913154344000, + 3200797260382557000, + 1714132797755189800 + ], + "localToReferenceXyzw": [ + 0.15591687851693786, + 0.5210156915859083, + 0.8039586074055388, + 0.24058913876843827 + ], + "metersPerUnit": 30856775814913670, + "boundsUnits": { + "min": [ + -149.04338038818852, + -146.68889103799495, + -107.0711252145712 + ], + "max": [ + 188.09798138188418, + 158.49674529871027, + 184.97422536764634 + ] + } + }, + "host": "milky-way", + "pointTransmission": "point-transmission.bin", + "preparation": { + "source": "source/model.json" + }, + "residentStacks": true, + "overlays": { + "smooth-dust": [ + "foreground-cloud" + ] + } + }, + "prepared": { + "format": "cssearth-volume-dataset-index@1", + "url": "prepared/datasets.json" + } +} diff --git a/src/objects/milky-way-pleiades-dust/source/depth-profiles.json b/src/objects/milky-way-pleiades-dust/source/depth-profiles.json new file mode 100644 index 00000000000..2660fe5872b --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/depth-profiles.json @@ -0,0 +1,32790 @@ +{ + "schema": "pleiades-normal-depth-grid@1", + "executionComplete": true, + "acceptedAsMeasuredThickness": false, + "primary": "values", + "alternatives": [ + { + "map": "edenhofer", + "file": "edenhofer-depth-prior.f32", + "foregroundFile": "edenhofer-foreground-fraction.f32", + "validityFile": "edenhofer-grid-validity.u8", + "missingSightlinesAreZeroWithValidityMask": true, + "normalization": "trapezoidal integral of each fully valid sight line is1; do not use an invalid alternative", + "fullValidSightlines": 289, + "conditionalMedianOffsetRangePc": [ + -4.250555416135885, + 8.478663019061639 + ], + "foregroundFractionRange": [ + 0.08658335357904434, + 0.814430296421051 + ] + }, + { + "map": "leike", + "file": "leike-depth-prior.f32", + "foregroundFile": "leike-foreground-fraction.f32", + "validityFile": "leike-grid-validity.u8", + "missingSightlinesAreZeroWithValidityMask": true, + "normalization": "trapezoidal integral of each fully valid sight line is1; do not use an invalid alternative", + "fullValidSightlines": 141, + "conditionalMedianOffsetRangePc": [ + -2.8487516233526717, + 5.10235991509491 + ], + "foregroundFractionRange": [ + 0.2687757611274719, + 0.8069780468940735 + ] + } + ], + "coordinate": { + "referenceRaDeg": 56.67978318, + "referenceDecDeg": 24.10845447, + "referenceNormalDepthPc": 136, + "x": "east pc at normal-depth136", + "y": "north pc at normal-depth136", + "z": "normal depth relative136pc; positive away from Earth", + "rayDefinition": "unit(136*normal+x*east+y*north); source normal-depth D samples ray at radial distance D/dot(ray,normal)" + }, + "grid": { + "nx": 17, + "ny": 17, + "nz": 113, + "min": [ + -12, + -12, + -16 + ], + "step": [ + 1.5, + 1.5, + 0.25 + ], + "max": [ + 12, + 12, + 12 + ], + "nodesNotCells": true, + "index": "((iy*nx+ix)*nz+iz)", + "storage": "little-endianfloat32", + "densityUnit": "normalized profile per pc" + }, + "registration": { + "kind": "global translation per map, no per-pixel shifts", + "edenhoferShiftPc": -0.766469473830881, + "leikeShiftPc": 4.0119736586549095, + "anchorDefinition": "median of native posterior-mean density in radial120–150pc at reference sight line mapped to136pc", + "outputWindow": "output window differs slightly from registration integration window; delivered center median is checked below" + }, + "constraints": { + "conditionalAnchor68Pc": [ + 135.25, + 136.5 + ], + "conditionalAnchor95Pc": [ + 132.25, + 137.75 + ], + "sourceMeanWidthsAreNotPhysicalThickness": true, + "unresolvedThickness": true, + "sourceAngularScaleEdenhoferArcmin": 13.742972, + "sourceLeikeStableScalePc": 2, + "foregroundFractionNotForced": true, + "adoptedStarNormalDepthPc": 136.7, + "sourceMapsNotIndependent": true + }, + "use": [ + "Use bilinear XY and linear depth interpolation offline. The coarse XY grid cannot introduce sub-grid corrugation.", + "Scale this density by a separately stated column constraint; distinguish total cloud column from column in front of a member.", + "Edenhofer covers every grid ray and is the primary prior. Leike is an alternate, not a patchwise fill: mixing based on source coverage creates a seam.", + "This file contains no two thin sheets and no density truncation at the stars. Foreground/back scattering follows source geometry.", + "The finite grid is not a physical edge: preserve wide-source attenuation and match the source-owned coarse component at the interface.", + "A translated posterior mean is an assumed broad density realization, not a measurement of physical thickness." + ], + "extraction": { + "executionComplete": true, + "maps": [ + { + "map": "Edenhofer", + "validNodes": 32657, + "totalNodes": 32657, + "fullSightlines": 289 + }, + { + "map": "Leike", + "validNodes": 30875, + "totalNodes": 32657, + "fullSightlines": 141 + } + ], + "cosineRange": [ + 0.9923042892102243, + 1.0000000000000002 + ] + }, + "deliveredCenterMedianNormalPc": 135.9775410630829, + "generator": "packages/bake/authoring/m45/dust/field/prepare-depth-record.mts", + "valueEncoding": "Native-extracted conditional normalized Float32 samples, preserved exactly as JSON numbers; not a measured physical-thickness field.", + "values": [ + 0.01908870041370392, + 0.018860047683119774, + 0.018896322697401047, + 0.0192620437592268, + 0.01963484287261963, + 0.020040422677993774, + 0.020464764907956123, + 0.020898092538118362, + 0.021402791142463684, + 0.021921781823039055, + 0.022413037717342377, + 0.022756192833185196, + 0.023104598745703697, + 0.02372884936630726, + 0.024748530238866806, + 0.02581202983856201, + 0.02610139362514019, + 0.02592366933822632, + 0.025747155770659447, + 0.026036445051431656, + 0.02643156796693802, + 0.026832686737179756, + 0.02734600566327572, + 0.027869515120983124, + 0.02839537523686886, + 0.02888854220509529, + 0.029390273615717888, + 0.029911497607827187, + 0.030467920005321503, + 0.031034696847200394, + 0.03152156248688698, + 0.031891319900751114, + 0.03226541355252266, + 0.032768238335847855, + 0.03338984027504921, + 0.034023236483335495, + 0.0348198339343071, + 0.035727497190237045, + 0.036658819764852524, + 0.037560831755399704, + 0.038461990654468536, + 0.03938477113842964, + 0.03941742330789566, + 0.039173759520053864, + 0.03893159702420235, + 0.03979719802737236, + 0.04095347225666046, + 0.04214334115386009, + 0.04335535317659378, + 0.04459972679615021, + 0.04587981104850769, + 0.04592374339699745, + 0.04574212059378624, + 0.04556121304631233, + 0.046011753380298615, + 0.0465877503156662, + 0.047170959413051605, + 0.047235336154699326, + 0.04718371853232384, + 0.047132156789302826, + 0.046839453279972076, + 0.04648056626319885, + 0.046124428510665894, + 0.045423123985528946, + 0.044600777328014374, + 0.04379332810640335, + 0.04439892619848251, + 0.04580632969737053, + 0.047258347272872925, + 0.04746232554316521, + 0.046650469303131104, + 0.04585250839591026, + 0.045080799609422684, + 0.044337496161460876, + 0.04360644519329071, + 0.043351493775844574, + 0.044098641723394394, + 0.0448586605489254, + 0.045421015471220016, + 0.04499686136841774, + 0.04457667097449303, + 0.04415560141205788, + 0.04337433725595474, + 0.0426068976521492, + 0.04185304045677185, + 0.04152260348200798, + 0.04127684608101845, + 0.041032541543245316, + 0.04046157747507095, + 0.039713867008686066, + 0.03897997736930847, + 0.0385751910507679, + 0.038611385971307755, + 0.038647618144750595, + 0.03835064172744751, + 0.036635737866163254, + 0.03499752655625343, + 0.03343256562948227, + 0.033280037343502045, + 0.03322609141469002, + 0.033172231167554855, + 0.032681968063116074, + 0.03198216110467911, + 0.031297340989112854, + 0.030673999339342117, + 0.030140137299895287, + 0.02961556985974312, + 0.02909720316529274, + 0.028547337278723717, + 0.028007864952087402, + 0.02747858688235283, + 0.027065671980381012, + 0.026695875450968742, + 0.01732088252902031, + 0.017796829342842102, + 0.018286937847733498, + 0.018885454162955284, + 0.01950356364250183, + 0.020029084756970406, + 0.020269542932510376, + 0.020512886345386505, + 0.020880283787846565, + 0.021365471184253693, + 0.021861933171749115, + 0.022353235632181168, + 0.022850245237350464, + 0.02335830219089985, + 0.023705944418907166, + 0.024055341258645058, + 0.024478914216160774, + 0.02522391639649868, + 0.025991592556238174, + 0.02670072205364704, + 0.027287421748042107, + 0.027887016534805298, + 0.0283739622682333, + 0.028762169182300568, + 0.029155682772397995, + 0.029954491183161736, + 0.030953919515013695, + 0.03198669105768204, + 0.03266769275069237, + 0.03328779712319374, + 0.033919669687747955, + 0.034022554755210876, + 0.03410455584526062, + 0.03424259275197983, + 0.035141292959451675, + 0.036063577979803085, + 0.03689169883728027, + 0.03711165487766266, + 0.0373329296708107, + 0.03777157515287399, + 0.03893513232469559, + 0.040134530514478683, + 0.04150734096765518, + 0.04326903447508812, + 0.04510550573468208, + 0.04629103094339371, + 0.04605585336685181, + 0.04582187160849571, + 0.046063948422670364, + 0.04716935753822327, + 0.04830128699541092, + 0.048939015716314316, + 0.04869023337960243, + 0.048442717641592026, + 0.04866500198841095, + 0.04973987862467766, + 0.05083848908543587, + 0.051259845495224, + 0.050298649817705154, + 0.049355484545230865, + 0.04893932864069939, + 0.049781978130340576, + 0.050639137625694275, + 0.051281362771987915, + 0.051163457334041595, + 0.05104582756757736, + 0.05075128376483917, + 0.04949789494276047, + 0.048275455832481384, + 0.04714082181453705, + 0.046940021216869354, + 0.046740077435970306, + 0.046540986746549606, + 0.045447446405887604, + 0.0443311482667923, + 0.04324227571487427, + 0.042892806231975555, + 0.04270561411976814, + 0.04251923784613609, + 0.04228438809514046, + 0.04202674701809883, + 0.04177068546414375, + 0.041240446269512177, + 0.04045231267809868, + 0.03967924043536186, + 0.03889632597565651, + 0.03807826340198517, + 0.03727740794420242, + 0.0365193672478199, + 0.03596045821905136, + 0.03541009873151779, + 0.03486816585063934, + 0.03383703902363777, + 0.03278509899973869, + 0.03176586329936981, + 0.031217044219374657, + 0.03089587390422821, + 0.0305780116468668, + 0.030103076249361038, + 0.02941100113093853, + 0.02873484045267105, + 0.028158117085695267, + 0.02811301313340664, + 0.02806798368692398, + 0.028023025020956993, + 0.02731158584356308, + 0.026501527056097984, + 0.02571549266576767, + 0.024898577481508255, + 0.02406216412782669, + 0.023253848776221275, + 0.02255612425506115, + 0.022193651646375656, + 0.016235435381531715, + 0.016536284238100052, + 0.016842709854245186, + 0.017247021198272705, + 0.0177160631865263, + 0.018197862431406975, + 0.01846088096499443, + 0.01870064064860344, + 0.0189819298684597, + 0.019500721246004105, + 0.020033694803714752, + 0.020703531801700592, + 0.02160673588514328, + 0.022549346089363098, + 0.023166300728917122, + 0.023545213043689728, + 0.023930318653583527, + 0.025085866451263428, + 0.02650861069560051, + 0.028012042865157127, + 0.027661148458719254, + 0.027276327833533287, + 0.027132531628012657, + 0.02836662344634533, + 0.029656847938895226, + 0.030728589743375778, + 0.031187165528535843, + 0.03165258839726448, + 0.032373733818531036, + 0.03343779966235161, + 0.03453684225678444, + 0.03517106547951698, + 0.035423409193754196, + 0.03567756712436676, + 0.03660127893090248, + 0.037896428257226944, + 0.039237406104803085, + 0.040873896330595016, + 0.042662713676691055, + 0.04452981427311897, + 0.04510841891169548, + 0.04541068151593208, + 0.04571497067809105, + 0.04534363001585007, + 0.04488743469119072, + 0.04443582892417908, + 0.045217208564281464, + 0.0461185947060585, + 0.04703794792294502, + 0.047944724559783936, + 0.04886716231703758, + 0.0498073473572731, + 0.051098212599754333, + 0.05244014784693718, + 0.053817324340343475, + 0.05454859510064125, + 0.055245935916900635, + 0.05595218762755394, + 0.05583716928958893, + 0.05564296245574951, + 0.05544942989945412, + 0.05446051061153412, + 0.053370021283626556, + 0.05230136960744858, + 0.05192434787750244, + 0.051713112741708755, + 0.051502738147974014, + 0.05119573324918747, + 0.05085381865501404, + 0.05051419138908386, + 0.049983467906713486, + 0.04934528470039368, + 0.048715248703956604, + 0.04778384417295456, + 0.04658449441194534, + 0.045415252447128296, + 0.04415461793541908, + 0.042739387601614, + 0.04136951267719269, + 0.04027220234274864, + 0.039950210601091385, + 0.039630793035030365, + 0.03930294141173363, + 0.03882027044892311, + 0.038343530148267746, + 0.037872638553380966, + 0.03707660362124443, + 0.03625307232141495, + 0.03544783219695091, + 0.03426576405763626, + 0.032941870391368866, + 0.03166913241147995, + 0.03051646240055561, + 0.02948783151805401, + 0.02849387377500534, + 0.027674812823534012, + 0.027385273948311806, + 0.02709876373410225, + 0.026815250515937805, + 0.026410093531012535, + 0.026005670428276062, + 0.025607436895370483, + 0.024708738550543785, + 0.02361682616174221, + 0.022573167458176613, + 0.0218698438256979, + 0.021647296845912933, + 0.021427014842629433, + 0.021165095269680023, + 0.020373210310935974, + 0.019610952585935593, + 0.018877215683460236, + 0.018816335126757622, + 0.014705554582178593, + 0.015028409659862518, + 0.015358353033661842, + 0.015755807980895042, + 0.016300980001688004, + 0.016865016892552376, + 0.017268722876906395, + 0.017546188086271286, + 0.017828110605478287, + 0.018663732334971428, + 0.01966768503189087, + 0.020679378882050514, + 0.020835865288972855, + 0.020993534475564957, + 0.02126760594546795, + 0.021872691810131073, + 0.02249499410390854, + 0.023130634799599648, + 0.02377905137836933, + 0.02444564737379551, + 0.02518186904489994, + 0.0259688813239336, + 0.02678048610687256, + 0.027680642902851105, + 0.02862589806318283, + 0.02960343286395073, + 0.03044125624001026, + 0.031296681612730026, + 0.032200999557971954, + 0.03335680440068245, + 0.034554094076156616, + 0.03565121814608574, + 0.03626922518014908, + 0.036897942423820496, + 0.0378681905567646, + 0.0395788848400116, + 0.04136686027050018, + 0.04267580434679985, + 0.043213702738285065, + 0.04375838488340378, + 0.044499531388282776, + 0.04546127840876579, + 0.046443816274404526, + 0.047099821269512177, + 0.04746190086007118, + 0.04782676696777344, + 0.048745378851890564, + 0.050103817135095596, + 0.051500104367733, + 0.052482400089502335, + 0.05317005515098572, + 0.05386671796441078, + 0.05525560304522514, + 0.05715697258710861, + 0.05912376567721367, + 0.059781450778245926, + 0.059476155787706375, + 0.05917241796851158, + 0.06018459424376488, + 0.06230989098548889, + 0.06451023370027542, + 0.06422840058803558, + 0.06156616657972336, + 0.05901427939534187, + 0.057770177721977234, + 0.05806739255785942, + 0.05836612731218338, + 0.05789710208773613, + 0.05610755458474159, + 0.05437332019209862, + 0.05288151651620865, + 0.051950495690107346, + 0.051035866141319275, + 0.04993592947721481, + 0.047721728682518005, + 0.04560571163892746, + 0.04359520599246025, + 0.042613863945007324, + 0.04165461286902428, + 0.04071695730090141, + 0.039416760206222534, + 0.0380980484187603, + 0.03682345896959305, + 0.03564653918147087, + 0.034531109035015106, + 0.03345058858394623, + 0.03216245397925377, + 0.030696626752614975, + 0.02929760329425335, + 0.028355762362480164, + 0.028362322598695755, + 0.028368886560201645, + 0.028267981484532356, + 0.026873350143432617, + 0.02554752491414547, + 0.024287108331918716, + 0.023553375154733658, + 0.022933118045330048, + 0.022329194471240044, + 0.021814316511154175, + 0.021364646032452583, + 0.020924244076013565, + 0.020335501059889793, + 0.01940264366567135, + 0.018512578681111336, + 0.017663346603512764, + 0.017624657601118088, + 0.017587264999747276, + 0.017549950629472733, + 0.01712740585207939, + 0.01654345914721489, + 0.015979424118995667, + 0.015454424545168877, + 0.01262696087360382, + 0.01285860687494278, + 0.013079442083835602, + 0.013305345550179482, + 0.013560712337493896, + 0.013820980675518513, + 0.014302562922239304, + 0.015315516851842403, + 0.016400212422013283, + 0.01714467443525791, + 0.01757810264825821, + 0.018022488802671432, + 0.018115520477294922, + 0.01810874603688717, + 0.018101975321769714, + 0.019215893000364304, + 0.02040388435125351, + 0.021540159359574318, + 0.02219630964100361, + 0.022872447967529297, + 0.023516837507486343, + 0.024090012535452843, + 0.024677155539393425, + 0.025511380285024643, + 0.02657952904701233, + 0.0276924017816782, + 0.028795689344406128, + 0.029916884377598763, + 0.031081732362508774, + 0.03216208890080452, + 0.03325163200497627, + 0.034378085285425186, + 0.03572193160653114, + 0.03712956979870796, + 0.03856875002384186, + 0.03953680768609047, + 0.040529169142246246, + 0.04168706759810448, + 0.04385876655578613, + 0.04614360257983208, + 0.04824421927332878, + 0.04918305575847626, + 0.05014016479253769, + 0.05153598636388779, + 0.05427902936935425, + 0.05716807022690773, + 0.05914969742298126, + 0.058553021401166916, + 0.057962365448474884, + 0.057985417544841766, + 0.05941266566514969, + 0.06087503582239151, + 0.0622965432703495, + 0.06357484310865402, + 0.06487936526536942, + 0.06597086787223816, + 0.06649670749902725, + 0.06702673435211182, + 0.06745346635580063, + 0.0675782635807991, + 0.06770329177379608, + 0.06807038187980652, + 0.06934697180986404, + 0.07064749300479889, + 0.07126442342996597, + 0.06787049025297165, + 0.0646381825208664, + 0.061691105365753174, + 0.06076013296842575, + 0.05984320864081383, + 0.05894012376666069, + 0.057123709470033646, + 0.05532880872488022, + 0.05359030142426491, + 0.05050439387559891, + 0.04735696315765381, + 0.044405680149793625, + 0.04259252920746803, + 0.04123535007238388, + 0.03992141783237457, + 0.03825346380472183, + 0.036354418843984604, + 0.03454965353012085, + 0.03266112878918648, + 0.0306150633841753, + 0.028697168454527855, + 0.027078932151198387, + 0.026262175291776657, + 0.025470051914453506, + 0.024701818823814392, + 0.023184603080153465, + 0.021752024069428444, + 0.020407967269420624, + 0.019669195637106895, + 0.019116275012493134, + 0.018578896299004555, + 0.0180122721940279, + 0.01742328517138958, + 0.016853557899594307, + 0.016276424750685692, + 0.015647035092115402, + 0.015041980892419815, + 0.014460323378443718, + 0.014014896005392075, + 0.013585658743977547, + 0.013169568032026291, + 0.012890351936221123, + 0.012674710713326931, + 0.0124626774340868, + 0.012152337469160557, + 0.011677172966301441, + 0.011220588348805904, + 0.0107953529804945, + 0.011253378354012966, + 0.011601103469729424, + 0.011776957660913467, + 0.011955478228628635, + 0.012200675904750824, + 0.012463074177503586, + 0.012748731300234795, + 0.01320034358650446, + 0.013667955994606018, + 0.014268945902585983, + 0.015130020678043365, + 0.016043057665228844, + 0.016553115099668503, + 0.01673617586493492, + 0.016921261325478554, + 0.017783289775252342, + 0.01888740248978138, + 0.020060066133737564, + 0.020689882338047028, + 0.02132822945713997, + 0.021949125453829765, + 0.022392939776182175, + 0.02284572646021843, + 0.023517144843935966, + 0.02465631812810898, + 0.025850670412182808, + 0.027195855975151062, + 0.02871876209974289, + 0.030326947569847107, + 0.03144824132323265, + 0.03223356977105141, + 0.033038511872291565, + 0.03417119383811951, + 0.03546341136097908, + 0.03680448979139328, + 0.038746509701013565, + 0.040913574397563934, + 0.04320184513926506, + 0.04471828415989876, + 0.04619753360748291, + 0.04772571474313736, + 0.04873707517981529, + 0.049757055938243866, + 0.050837501883506775, + 0.05328155308961868, + 0.055843107402324677, + 0.058392226696014404, + 0.05901172384619713, + 0.05963779613375664, + 0.060482483357191086, + 0.0638168528676033, + 0.06733504682779312, + 0.07072223722934723, + 0.07057984173297882, + 0.07043773680925369, + 0.07041943073272705, + 0.07216228544712067, + 0.07394827157258987, + 0.07572737336158752, + 0.07604698091745377, + 0.07636793702840805, + 0.07669024914503098, + 0.07680981606245041, + 0.0769260823726654, + 0.07704252749681473, + 0.07394183427095413, + 0.07068914920091629, + 0.06757955253124237, + 0.06551992893218994, + 0.06370419263839722, + 0.06193877011537552, + 0.05864908546209335, + 0.054991383105516434, + 0.051561787724494934, + 0.049023158848285675, + 0.04702597111463547, + 0.04511014744639397, + 0.0427846685051918, + 0.040069542825222015, + 0.03752671927213669, + 0.03533511236310005, + 0.03365789353847504, + 0.03206028789281845, + 0.030572256073355675, + 0.029342789202928543, + 0.02816276252269745, + 0.02703019417822361, + 0.02478482387959957, + 0.022677354514598846, + 0.020749082788825035, + 0.019604455679655075, + 0.01872582547366619, + 0.01788657158613205, + 0.01730668731033802, + 0.016945909708738327, + 0.01659265160560608, + 0.016080180183053017, + 0.015167108736932278, + 0.014305884018540382, + 0.013497529551386833, + 0.013029981404542923, + 0.012578628025949001, + 0.012142910622060299, + 0.011747191660106182, + 0.01137323398143053, + 0.011011180467903614, + 0.01070057787001133, + 0.010450080968439579, + 0.010205448605120182, + 0.009955310262739658, + 0.009625709615647793, + 0.009307022206485271, + 0.008998884819447994, + 0.01115641463547945, + 0.011682308278977871, + 0.012169417925179005, + 0.012676837854087353, + 0.01302312407642603, + 0.013298130594193935, + 0.013578943908214569, + 0.013980608433485031, + 0.01439979113638401, + 0.01492131408303976, + 0.015845956280827522, + 0.016827896237373352, + 0.017760587856173515, + 0.018588513135910034, + 0.01945503242313862, + 0.02043130435049534, + 0.02149840071797371, + 0.02262123115360737, + 0.02271832525730133, + 0.022601310163736343, + 0.022499971091747284, + 0.023737840354442596, + 0.02504381351172924, + 0.026234397664666176, + 0.02657793089747429, + 0.026925966143608093, + 0.027918651700019836, + 0.030387049540877342, + 0.03307368978857994, + 0.03463549539446831, + 0.03463554382324219, + 0.03463558852672577, + 0.03568897396326065, + 0.03761111944913864, + 0.03963679075241089, + 0.041546862572431564, + 0.04343375563621521, + 0.04540633782744408, + 0.046570323407649994, + 0.04746698588132858, + 0.048380911350250244, + 0.049890629947185516, + 0.051578838378190994, + 0.05332417041063309, + 0.05478205904364586, + 0.05622713267803192, + 0.057710323482751846, + 0.060387544333934784, + 0.0633184090256691, + 0.06639152020215988, + 0.06706424802541733, + 0.06752733141183853, + 0.06799361854791641, + 0.06858289986848831, + 0.06918765604496002, + 0.06979775428771973, + 0.07186929136514664, + 0.07416316866874695, + 0.07653026282787323, + 0.0755489319562912, + 0.07408858835697174, + 0.07265646755695343, + 0.07124496251344681, + 0.06985935568809509, + 0.06850069761276245, + 0.06667622178792953, + 0.06474221497774124, + 0.06286430358886719, + 0.06103464961051941, + 0.0592552125453949, + 0.057527653872966766, + 0.05536136031150818, + 0.05291340872645378, + 0.05057370662689209, + 0.04838006570935249, + 0.04633307084441185, + 0.04437267780303955, + 0.04219144210219383, + 0.03946413844823837, + 0.03691313415765762, + 0.03456425294280052, + 0.032565582543611526, + 0.030682481825351715, + 0.028908271342515945, + 0.02725430391728878, + 0.02569539286196232, + 0.02422565221786499, + 0.02316436544060707, + 0.022236013785004616, + 0.021344872191548347, + 0.020768212154507637, + 0.020410677418112755, + 0.02005929686129093, + 0.019370783120393753, + 0.018097037449479103, + 0.016907045617699623, + 0.01581629365682602, + 0.014971700496971607, + 0.014172209426760674, + 0.013415410183370113, + 0.012908733449876308, + 0.012460836209356785, + 0.012028479017317295, + 0.011585332453250885, + 0.011138617061078548, + 0.01070912554860115, + 0.010324227623641491, + 0.010032984428107738, + 0.00974995642900467, + 0.009474912658333778, + 0.009189658798277378, + 0.008911771699786186, + 0.00864228792488575, + 0.00909251719713211, + 0.00939183495938778, + 0.009824861772358418, + 0.010277854278683662, + 0.01077137142419815, + 0.011301841586828232, + 0.011858436278998852, + 0.012175366282463074, + 0.012458927929401398, + 0.012795113027095795, + 0.013536087237298489, + 0.01431997213512659, + 0.01503959484398365, + 0.015569067560136318, + 0.01611718162894249, + 0.016825461760163307, + 0.017688211053609848, + 0.018595198169350624, + 0.019154950976371765, + 0.01959170401096344, + 0.020038414746522903, + 0.02055559866130352, + 0.021091490983963013, + 0.021704083308577538, + 0.023052331060171127, + 0.024484332650899887, + 0.0258349422365427, + 0.02667122520506382, + 0.02753457799553871, + 0.02865382842719555, + 0.030239861458539963, + 0.03191368654370308, + 0.033504702150821686, + 0.03497495502233505, + 0.03650972619652748, + 0.03846826031804085, + 0.040809448808431625, + 0.043293122202157974, + 0.04496560990810394, + 0.046195026487112045, + 0.04745806008577347, + 0.04917635768651962, + 0.05112257972359657, + 0.05314582213759422, + 0.05599016696214676, + 0.059214770793914795, + 0.06262508034706116, + 0.06549207866191864, + 0.06830821931362152, + 0.0712454542517662, + 0.07400306314229965, + 0.07680001854896545, + 0.07970267534255981, + 0.08170270919799805, + 0.08353312313556671, + 0.08540453761816025, + 0.08620695024728775, + 0.08675027638673782, + 0.08729702234268188, + 0.08646062761545181, + 0.08523126691579819, + 0.08401938527822495, + 0.08180944621562958, + 0.07927766442298889, + 0.07682424783706665, + 0.07419539988040924, + 0.07152722030878067, + 0.06895498931407928, + 0.06620803475379944, + 0.06337429583072662, + 0.06066184118390083, + 0.05759412422776222, + 0.054165612906217575, + 0.05094119533896446, + 0.04754285886883736, + 0.04371964558959007, + 0.04020388424396515, + 0.03703891858458519, + 0.03437081724405289, + 0.03189490735530853, + 0.02963331900537014, + 0.028225982561707497, + 0.02688548155128956, + 0.025608642026782036, + 0.023968664929270744, + 0.02237631008028984, + 0.02088974043726921, + 0.019792497158050537, + 0.018883537501096725, + 0.01801631972193718, + 0.017189515754580498, + 0.016401279717683792, + 0.015649190172553062, + 0.014887575060129166, + 0.014033019542694092, + 0.01322751585394144, + 0.012468247674405575, + 0.012047667987644672, + 0.011642358265817165, + 0.011250683106482029, + 0.01080556120723486, + 0.010354691185057163, + 0.009922632947564125, + 0.009572579525411129, + 0.009311245754361153, + 0.00905704777687788, + 0.008831681683659554, + 0.008736484684050083, + 0.008642314001917839, + 0.008549157530069351, + 0.00817222148180008, + 0.007756235543638468, + 0.007361423224210739, + 0.013798054307699203, + 0.014276565983891487, + 0.014475623145699501, + 0.014677455648779869, + 0.015223130583763123, + 0.01605111174285412, + 0.01692412607371807, + 0.017068682238459587, + 0.01706570014357567, + 0.01715400256216526, + 0.01835569553077221, + 0.01964157074689865, + 0.02088047005236149, + 0.021869001910090446, + 0.02290433831512928, + 0.023717807605862617, + 0.024299677461385727, + 0.024895817041397095, + 0.025550706312060356, + 0.026241272687911987, + 0.026950500905513763, + 0.02760298177599907, + 0.028261659666895866, + 0.028939897194504738, + 0.029704373329877853, + 0.030489042401313782, + 0.031426556408405304, + 0.032941218465566635, + 0.034528885036706924, + 0.035820771008729935, + 0.036395490169525146, + 0.03697943687438965, + 0.03785599395632744, + 0.039115190505981445, + 0.04041627049446106, + 0.043119486421346664, + 0.047246258705854416, + 0.0517679825425148, + 0.052247703075408936, + 0.050228189677000046, + 0.04828673228621483, + 0.04917771369218826, + 0.0513746403157711, + 0.05366972088813782, + 0.055074021220207214, + 0.05616793408989906, + 0.05728358030319214, + 0.05908626317977905, + 0.06114457547664642, + 0.06327459961175919, + 0.06557925790548325, + 0.06799513101577759, + 0.07050000876188278, + 0.069925457239151, + 0.06855139881372452, + 0.06720434129238129, + 0.06587264686822891, + 0.06456416845321655, + 0.06328167766332626, + 0.06354966014623642, + 0.06436710804700851, + 0.06519506126642227, + 0.06421391665935516, + 0.062450289726257324, + 0.06073509529232979, + 0.059083111584186554, + 0.057485707104206085, + 0.055931489914655685, + 0.05456613749265671, + 0.05336017161607742, + 0.052180856466293335, + 0.050561074167490005, + 0.04839605093002319, + 0.046323731541633606, + 0.044825274497270584, + 0.04445021599531174, + 0.04407830163836479, + 0.043113213032484055, + 0.03941468894481659, + 0.03603344410657883, + 0.03296257182955742, + 0.03165259212255478, + 0.030394675210118294, + 0.02918674610555172, + 0.027727404609322548, + 0.02628650702536106, + 0.024920489639043808, + 0.02380061335861683, + 0.022823190316557884, + 0.021885907277464867, + 0.020934075117111206, + 0.019958194345235825, + 0.01902780681848526, + 0.01828525960445404, + 0.018111400306224823, + 0.017939195036888123, + 0.017768628895282745, + 0.01680697314441204, + 0.01586790755391121, + 0.014981311745941639, + 0.014494959264993668, + 0.014174808748066425, + 0.013861729763448238, + 0.013566382229328156, + 0.013292360119521618, + 0.01302387285977602, + 0.012747809290885925, + 0.012376995757222176, + 0.012016967870295048, + 0.011667412705719471, + 0.011581405065953732, + 0.011563201434910297, + 0.011545026674866676, + 0.015523768961429596, + 0.016336489468812943, + 0.016355423256754875, + 0.016374381259083748, + 0.016819043084979057, + 0.017562972381711006, + 0.01833980716764927, + 0.018802611157298088, + 0.01922249048948288, + 0.01969820261001587, + 0.02058202587068081, + 0.021505504846572876, + 0.02233562245965004, + 0.022922171279788017, + 0.023524126037955284, + 0.02449301816523075, + 0.025810154154896736, + 0.027198122814297676, + 0.027808185666799545, + 0.02813338115811348, + 0.028462376445531845, + 0.02954704686999321, + 0.030741550028324127, + 0.03197886794805527, + 0.03320382162928581, + 0.034475699067115784, + 0.03564354032278061, + 0.03633101284503937, + 0.03703174367547035, + 0.038026440888643265, + 0.03955889493227005, + 0.04115310683846474, + 0.04228482395410538, + 0.04286416620016098, + 0.043451447039842606, + 0.045328110456466675, + 0.04829059913754463, + 0.05144670978188515, + 0.052133962512016296, + 0.05148337408900261, + 0.05084090679883957, + 0.05222710594534874, + 0.05445699393749237, + 0.056782085448503494, + 0.05754965543746948, + 0.05785014107823372, + 0.05815219506621361, + 0.057763874530792236, + 0.05721641704440117, + 0.05667414888739586, + 0.056969910860061646, + 0.057446811348199844, + 0.057927701622247696, + 0.05796138197183609, + 0.057899173349142075, + 0.05783703550696373, + 0.059659071266651154, + 0.06201363354921341, + 0.0644611194729805, + 0.06268319487571716, + 0.05976703017950058, + 0.05698654055595398, + 0.05560600757598877, + 0.0547473207116127, + 0.05390189215540886, + 0.0531260222196579, + 0.052391085773706436, + 0.051666319370269775, + 0.050301071256399155, + 0.048491351306438446, + 0.046746741980314255, + 0.045750271528959274, + 0.045568011701107025, + 0.045386482030153275, + 0.04485638439655304, + 0.04367382079362869, + 0.04252243414521217, + 0.04121497645974159, + 0.03924516215920448, + 0.037369485944509506, + 0.03555920720100403, + 0.03336707130074501, + 0.0313100703060627, + 0.02937988005578518, + 0.028058592230081558, + 0.02686581388115883, + 0.025723738595843315, + 0.02489365264773369, + 0.02421097457408905, + 0.023547016084194183, + 0.023092294111847878, + 0.02285902015864849, + 0.02262810617685318, + 0.022154830396175385, + 0.020959755405783653, + 0.019829144701361656, + 0.01875952072441578, + 0.018419060856103897, + 0.018087297677993774, + 0.017761509865522385, + 0.017246440052986145, + 0.01667737029492855, + 0.016127075999975204, + 0.01575031690299511, + 0.01557079702615738, + 0.015393324196338654, + 0.01512777991592884, + 0.014364736154675484, + 0.013640180230140686, + 0.012952171266078949, + 0.01260569877922535, + 0.012331774458289146, + 0.012063805013895035, + 0.014440536499023438, + 0.014944301918148994, + 0.015428029000759125, + 0.01592741347849369, + 0.016486704349517822, + 0.017085392028093338, + 0.017705818638205528, + 0.018434271216392517, + 0.019196925684809685, + 0.02000935934484005, + 0.02093365415930748, + 0.02190064638853073, + 0.02268024906516075, + 0.02316553145647049, + 0.023661192506551743, + 0.024632977321743965, + 0.025926467031240463, + 0.027287878096103668, + 0.028204411268234253, + 0.029044773429632187, + 0.029911620542407036, + 0.030933700501918793, + 0.03199070319533348, + 0.03313585743308067, + 0.03457651659846306, + 0.03607981279492378, + 0.03763386607170105, + 0.039223019033670425, + 0.0408792719244957, + 0.042158063501119614, + 0.04293143004179001, + 0.043718982487916946, + 0.04492479935288429, + 0.046477966010570526, + 0.04808482900261879, + 0.049546174705028534, + 0.050950467586517334, + 0.052394572645425797, + 0.05324684828519821, + 0.05390455201268196, + 0.054570384323596954, + 0.05504939332604408, + 0.05548964813351631, + 0.055933427065610886, + 0.056117720901966095, + 0.05626353621482849, + 0.05640972778201103, + 0.056672077625989914, + 0.056947994977235794, + 0.05722524970769882, + 0.05939412862062454, + 0.06181645765900612, + 0.0643375813961029, + 0.06393450498580933, + 0.06328233331441879, + 0.06263682246208191, + 0.0605640783905983, + 0.05841474235057831, + 0.056341685354709625, + 0.055435746908187866, + 0.05470676347613335, + 0.05398736521601677, + 0.05299130827188492, + 0.05195183679461479, + 0.050932757556438446, + 0.050691697746515274, + 0.050704509019851685, + 0.050717324018478394, + 0.05029677599668503, + 0.04966500401496887, + 0.04904117062687874, + 0.04730919376015663, + 0.04481825977563858, + 0.04245847091078758, + 0.04075157642364502, + 0.03976316750049591, + 0.03879872336983681, + 0.037427157163619995, + 0.03517135977745056, + 0.03305152803659439, + 0.031212270259857178, + 0.030317185446619987, + 0.0294477716088295, + 0.028603289276361465, + 0.02794448472559452, + 0.02730492129921913, + 0.02667999640107155, + 0.025572918355464935, + 0.02438195049762726, + 0.02324645221233368, + 0.022574367001652718, + 0.022222144529223442, + 0.02187541499733925, + 0.021360350772738457, + 0.020541440695524216, + 0.01975392922759056, + 0.01899401843547821, + 0.018241213634610176, + 0.017518246546387672, + 0.016823934391140938, + 0.016378166154026985, + 0.015986410900950432, + 0.015604027546942234, + 0.015182571485638618, + 0.014734956435859203, + 0.014300537295639515, + 0.013948425650596619, + 0.01380609069019556, + 0.013665208593010902, + 0.013525765389204025, + 0.013475078158080578, + 0.013430704362690449, + 0.01338647585362196, + 0.016461310908198357, + 0.017115745693445206, + 0.01753988116979599, + 0.017974525690078735, + 0.018332086503505707, + 0.018680153414607048, + 0.01912519708275795, + 0.020412934944033623, + 0.021787380799651146, + 0.022987641394138336, + 0.023730015382170677, + 0.02449635975062847, + 0.024936774745583534, + 0.02512284927070141, + 0.02531030960381031, + 0.026326052844524384, + 0.027621833607554436, + 0.028981389477849007, + 0.02969823218882084, + 0.03041989356279373, + 0.031224416568875313, + 0.03239654749631882, + 0.033612679690122604, + 0.034606270492076874, + 0.035069938749074936, + 0.035539817065000534, + 0.03641614690423012, + 0.03776923567056656, + 0.03917259722948074, + 0.04022887349128723, + 0.041053224354982376, + 0.04189446568489075, + 0.043378252536058426, + 0.04516111686825752, + 0.04701725393533707, + 0.04776793345808983, + 0.048282425850629807, + 0.048802465200424194, + 0.05057128146290779, + 0.052532389760017395, + 0.054569538682699203, + 0.05345796048641205, + 0.05230077728629112, + 0.05124155431985855, + 0.05262614041566849, + 0.05404813587665558, + 0.055390287190675735, + 0.055013932287693024, + 0.054640136659145355, + 0.05427910387516022, + 0.05403517931699753, + 0.053792353719472885, + 0.05360890179872513, + 0.054077766835689545, + 0.054550737142562866, + 0.05495631694793701, + 0.054360609501600266, + 0.05377136170864105, + 0.05317714810371399, + 0.052264925092458725, + 0.0513683557510376, + 0.05048716068267822, + 0.05089552327990532, + 0.0513293594121933, + 0.05176690220832825, + 0.05055781081318855, + 0.04923165962100029, + 0.04794028401374817, + 0.04705512151122093, + 0.04626078903675079, + 0.04547986760735512, + 0.04416925460100174, + 0.04270242899656296, + 0.041284315288066864, + 0.04085933789610863, + 0.04104921594262123, + 0.04123997315764427, + 0.040367383509874344, + 0.03838346526026726, + 0.036497049033641815, + 0.03484760597348213, + 0.03356986492872238, + 0.03233897313475609, + 0.031238870695233345, + 0.030666304752230644, + 0.03010423108935356, + 0.029552461579442024, + 0.0285057220607996, + 0.02747342176735401, + 0.02647850662469864, + 0.025454530492424965, + 0.024448968470096588, + 0.02348313480615616, + 0.02277616411447525, + 0.022289713844656944, + 0.0218136515468359, + 0.021374352276325226, + 0.021012550219893456, + 0.020656870678067207, + 0.02030288055539131, + 0.019625887274742126, + 0.01897146925330162, + 0.018338872119784355, + 0.01783672533929348, + 0.017387570813298225, + 0.0169497262686491, + 0.016665853559970856, + 0.016573790460824966, + 0.016482235863804817, + 0.01637709140777588, + 0.016163073480129242, + 0.01595185324549675, + 0.015743393450975418, + 0.017171384766697884, + 0.018105678260326385, + 0.01922208070755005, + 0.02036396414041519, + 0.02068890444934368, + 0.02101902849972248, + 0.021407851949334145, + 0.02192639373242855, + 0.02245749905705452, + 0.023079879581928253, + 0.02378484606742859, + 0.024511346593499184, + 0.025368956848978996, + 0.026288075372576714, + 0.027240492403507233, + 0.027684301137924194, + 0.028132876381278038, + 0.028681278228759766, + 0.029637588188052177, + 0.030625786632299423, + 0.031396519392728806, + 0.03176360949873924, + 0.03213498741388321, + 0.03295321762561798, + 0.03418176621198654, + 0.03545611351728439, + 0.036727424710989, + 0.03802094981074333, + 0.039360035210847855, + 0.03992684558033943, + 0.04032806307077408, + 0.04073331505060196, + 0.04194856435060501, + 0.043250616639852524, + 0.044562697410583496, + 0.045251425355672836, + 0.04595079645514488, + 0.04665227606892586, + 0.04730541631579399, + 0.04796769842505455, + 0.04852995648980141, + 0.048655830323696136, + 0.04878202825784683, + 0.04923057183623314, + 0.05066477879881859, + 0.052140772342681885, + 0.05309445038437843, + 0.05266033113002777, + 0.052229758352041245, + 0.051868319511413574, + 0.05165758728981018, + 0.05144771561026573, + 0.05108642578125, + 0.050389546900987625, + 0.04970217123627663, + 0.04901962727308273, + 0.04833564534783363, + 0.04766121134161949, + 0.04717645421624184, + 0.04720421880483627, + 0.0472320057451725, + 0.04724493995308876, + 0.04720286652445793, + 0.04716083034873009, + 0.0470532663166523, + 0.046567317098379135, + 0.0460863821208477, + 0.045562732964754105, + 0.04435458779335022, + 0.04317848011851311, + 0.04203355684876442, + 0.04210807383060455, + 0.04222949966788292, + 0.04235127568244934, + 0.041000403463840485, + 0.03943565860390663, + 0.03793063014745712, + 0.037792306393384933, + 0.03820371255278587, + 0.038619596511125565, + 0.03809482604265213, + 0.03684735298156738, + 0.03564073517918587, + 0.034496329724788666, + 0.03342391178011894, + 0.032384831458330154, + 0.031540095806121826, + 0.03137655928730965, + 0.031213870272040367, + 0.03105202503502369, + 0.02988334372639656, + 0.028747204691171646, + 0.027654260396957397, + 0.02688179723918438, + 0.026215700432658195, + 0.025566106662154198, + 0.025259701535105705, + 0.025259369984269142, + 0.02525903843343258, + 0.02510491944849491, + 0.024517659097909927, + 0.023944133892655373, + 0.023384027183055878, + 0.022682998329401016, + 0.02199966460466385, + 0.021336914971470833, + 0.02094828523695469, + 0.020685359835624695, + 0.020425735041499138, + 0.020113356411457062, + 0.019709188491106033, + 0.019313141703605652, + 0.01893436349928379, + 0.015939518809318542, + 0.016157597303390503, + 0.016378657892346382, + 0.01672382839024067, + 0.017352605238556862, + 0.018005022779107094, + 0.018700212240219116, + 0.019436366856098175, + 0.02020150050520897, + 0.02076505683362484, + 0.021292146295309067, + 0.021851392462849617, + 0.022796086966991425, + 0.02378162555396557, + 0.024597272276878357, + 0.024840405210852623, + 0.025085940957069397, + 0.02558891661465168, + 0.026405680924654007, + 0.02724851481616497, + 0.028096958994865417, + 0.02895987778902054, + 0.029849296435713768, + 0.030766379088163376, + 0.03171171247959137, + 0.03268609568476677, + 0.034079037606716156, + 0.03554537892341614, + 0.03704262152314186, + 0.03830971568822861, + 0.039620157331228256, + 0.04070477932691574, + 0.04085715860128403, + 0.04101010784506798, + 0.04144277051091194, + 0.04247249662876129, + 0.043527811765670776, + 0.04442776367068291, + 0.045082759112119675, + 0.04574739933013916, + 0.046203989535570145, + 0.046429913491010666, + 0.04665694013237953, + 0.046852726489305496, + 0.047021232545375824, + 0.0471903458237648, + 0.047563325613737106, + 0.04809234291315079, + 0.04862723872065544, + 0.04873375967144966, + 0.048545047640800476, + 0.04835706576704979, + 0.048007503151893616, + 0.04755229502916336, + 0.04710140451788902, + 0.0468546561896801, + 0.04675101861357689, + 0.046647608280181885, + 0.04677434265613556, + 0.04708748683333397, + 0.04740272834897041, + 0.04750484600663185, + 0.0473986454308033, + 0.04729267582297325, + 0.046823617070913315, + 0.045910827815532684, + 0.04501582682132721, + 0.04434088617563248, + 0.044031012803316116, + 0.04372331127524376, + 0.04326888546347618, + 0.04240768030285835, + 0.04156361147761345, + 0.040813591331243515, + 0.04052404686808586, + 0.04023655876517296, + 0.039950739592313766, + 0.039636656641960144, + 0.0393250398337841, + 0.03901587799191475, + 0.03847217559814453, + 0.03789820149540901, + 0.037332791835069656, + 0.03713880851864815, + 0.037108685821294785, + 0.03707858547568321, + 0.037004951387643814, + 0.03688862919807434, + 0.03677267208695412, + 0.03644101321697235, + 0.035613030195236206, + 0.0348038524389267, + 0.03401753678917885, + 0.03330318257212639, + 0.032603830099105835, + 0.03191916272044182, + 0.03161477670073509, + 0.031386394053697586, + 0.031159657984972, + 0.03040284290909767, + 0.029284093528985977, + 0.028206512331962585, + 0.02733205072581768, + 0.026866905391216278, + 0.026409678161144257, + 0.025960229337215424, + 0.025487827137112617, + 0.02502397634088993, + 0.02456856518983841, + 0.02402081899344921, + 0.0234398003667593, + 0.022872835397720337, + 0.02241949550807476, + 0.012286359444260597, + 0.012711642310023308, + 0.01315164566040039, + 0.01363521907478571, + 0.014153650030493736, + 0.0146917924284935, + 0.01534934714436531, + 0.016048353165388107, + 0.016693174839019775, + 0.01684180460870266, + 0.016991760581731796, + 0.017237024381756783, + 0.017644867300987244, + 0.01806236244738102, + 0.018518421798944473, + 0.019006185233592987, + 0.019506795331835747, + 0.0203277338296175, + 0.021266860887408257, + 0.022249378263950348, + 0.023050930351018906, + 0.023876525461673737, + 0.024686457589268684, + 0.025258710607886314, + 0.025844229385256767, + 0.02644028142094612, + 0.027042923495173454, + 0.027659302577376366, + 0.028749724850058556, + 0.030502554029226303, + 0.03236224502325058, + 0.03354997560381889, + 0.03415825217962265, + 0.03477756306529045, + 0.035236213356256485, + 0.03561409190297127, + 0.03599602356553078, + 0.03718478977680206, + 0.038685429841279984, + 0.0402466282248497, + 0.0405178964138031, + 0.04051293060183525, + 0.0405079685151577, + 0.04145005717873573, + 0.04254348948597908, + 0.04366576299071312, + 0.04381496459245682, + 0.04388144239783287, + 0.04394801706075668, + 0.04461124539375305, + 0.045319776982069016, + 0.046039558947086334, + 0.04575203359127045, + 0.04541480913758278, + 0.04508006572723389, + 0.045410580933094025, + 0.04578649625182152, + 0.046165525913238525, + 0.04694399610161781, + 0.04777472838759422, + 0.04862015321850777, + 0.04846477136015892, + 0.04815606772899628, + 0.04784933105111122, + 0.04735882580280304, + 0.04682876542210579, + 0.04630464315414429, + 0.04648684337735176, + 0.04693951457738876, + 0.04739658907055855, + 0.04713078960776329, + 0.04644308239221573, + 0.045765411108732224, + 0.04575774818658829, + 0.046384334564208984, + 0.04701950028538704, + 0.047422319650650024, + 0.047437142580747604, + 0.04745196923613548, + 0.047424402087926865, + 0.04725680127739906, + 0.04708979278802872, + 0.04689736291766167, + 0.04633192718029022, + 0.04577331617474556, + 0.04522142931818962, + 0.04570208117365837, + 0.04633193090558052, + 0.04697047173976898, + 0.04590196534991264, + 0.04407605901360512, + 0.042322788387537, + 0.040866363793611526, + 0.03972448781132698, + 0.03861451521515846, + 0.03762375935912132, + 0.0369730181992054, + 0.03633353114128113, + 0.03570510447025299, + 0.03512720391154289, + 0.03456037491559982, + 0.03400269150733948, + 0.03301694616675377, + 0.03186360374093056, + 0.03075055032968521, + 0.029703591018915176, + 0.028733909130096436, + 0.027795881032943726, + 0.026944482699036598, + 0.026805954053997993, + 0.026668136939406395, + 0.026531029492616653, + 0.025682657957077026, + 0.008918803185224533, + 0.009306305088102818, + 0.00970942247658968, + 0.010021978989243507, + 0.010344596579670906, + 0.010708593763411045, + 0.011169547215104103, + 0.01165034156292677, + 0.012129201553761959, + 0.012606645934283733, + 0.013102884404361248, + 0.013507175259292126, + 0.013888181187212467, + 0.014279933646321297, + 0.014648925513029099, + 0.01502676960080862, + 0.015415351837873459, + 0.015818491578102112, + 0.01623217761516571, + 0.01678568497300148, + 0.017586132511496544, + 0.018424751237034798, + 0.019003067165613174, + 0.01934274286031723, + 0.019688492640852928, + 0.0207431111484766, + 0.022181157022714615, + 0.02371889352798462, + 0.02454681321978569, + 0.025244150310754776, + 0.025961296632885933, + 0.026549171656370163, + 0.02714434824883938, + 0.0277713555842638, + 0.028667474165558815, + 0.02959251031279564, + 0.030499229207634926, + 0.03117530420422554, + 0.031866371631622314, + 0.03257397189736366, + 0.03330133482813835, + 0.034044940024614334, + 0.03491691127419472, + 0.036088887602090836, + 0.03730020299553871, + 0.03853876516222954, + 0.03979094699025154, + 0.04108380898833275, + 0.04206332936882973, + 0.04242614284157753, + 0.04279208555817604, + 0.04331784322857857, + 0.044123969972133636, + 0.04494510591030121, + 0.04549555480480194, + 0.04554056003689766, + 0.04558561369776726, + 0.04554733633995056, + 0.04534294828772545, + 0.045139480382204056, + 0.045091964304447174, + 0.045424822717905045, + 0.0457601360976696, + 0.04622884839773178, + 0.04714617505669594, + 0.04808169975876808, + 0.048956215381622314, + 0.04940216988325119, + 0.04985218495130539, + 0.05030200630426407, + 0.050686806440353394, + 0.0510745495557785, + 0.05146525800228119, + 0.05191648006439209, + 0.052374906837940216, + 0.05283738300204277, + 0.05410447344183922, + 0.05558664724230766, + 0.057109422981739044, + 0.05763082951307297, + 0.05764620378613472, + 0.05766158923506737, + 0.057226765900850296, + 0.056361373513936996, + 0.05550907552242279, + 0.05475514382123947, + 0.05418887361884117, + 0.053628452122211456, + 0.05302568897604942, + 0.05208826810121536, + 0.05116742476820946, + 0.05026285722851753, + 0.04862669110298157, + 0.046966955065727234, + 0.04536386579275131, + 0.04384591430425644, + 0.04239348694682121, + 0.04098917171359062, + 0.03981224074959755, + 0.03892198204994202, + 0.03805163502693176, + 0.03714743256568909, + 0.03594072163105011, + 0.03477321192622185, + 0.03364362567663193, + 0.03295114263892174, + 0.03234488144516945, + 0.03174977749586105, + 0.030932564288377762, + 0.02994069829583168, + 0.028980635106563568, + 0.028041860088706017, + 0.0270981527864933, + 0.007480291649699211, + 0.00777376489713788, + 0.008025678806006908, + 0.008218614384531975, + 0.008416187949478626, + 0.008698984049260616, + 0.009024572558701038, + 0.00936234649270773, + 0.009737810119986534, + 0.010129190981388092, + 0.010520038194954395, + 0.010860729962587357, + 0.011212455108761787, + 0.011588983237743378, + 0.01199682243168354, + 0.012419011443853378, + 0.012739354744553566, + 0.012998859398066998, + 0.013263651169836521, + 0.013880711048841476, + 0.014606093056499958, + 0.015369380824267864, + 0.01578461192548275, + 0.016209714114665985, + 0.01674293540418148, + 0.017848823219537735, + 0.01902775652706623, + 0.019933093339204788, + 0.020035888999700546, + 0.020139213651418686, + 0.020606879144906998, + 0.021603403612971306, + 0.022648116573691368, + 0.023410238325595856, + 0.02390054427087307, + 0.024401120841503143, + 0.0249981377273798, + 0.02566232532262802, + 0.026344159618020058, + 0.027462422847747803, + 0.028813375160098076, + 0.030230781063437462, + 0.030809877440333366, + 0.03112109750509262, + 0.03143545985221863, + 0.032491084188222885, + 0.03376467525959015, + 0.0350881889462471, + 0.036325253546237946, + 0.037578046321868896, + 0.03887404128909111, + 0.039068493992090225, + 0.039060138165950775, + 0.039051786065101624, + 0.039411574602127075, + 0.039845068007707596, + 0.04028332978487015, + 0.04124220833182335, + 0.04234195500612259, + 0.04347102716565132, + 0.04447288438677788, + 0.04545212164521217, + 0.04645292088389397, + 0.0476231724023819, + 0.04888143390417099, + 0.05017293617129326, + 0.05104091018438339, + 0.05167146027088165, + 0.052309799939394, + 0.05313141644001007, + 0.054109130054712296, + 0.05510484054684639, + 0.05638585239648819, + 0.058037929236888885, + 0.0597384013235569, + 0.06122227758169174, + 0.06216465309262276, + 0.06312153488397598, + 0.06399857997894287, + 0.0644373670220375, + 0.0648791640996933, + 0.0653107538819313, + 0.06472861766815186, + 0.06415166705846786, + 0.06357987225055695, + 0.06310170143842697, + 0.06264474987983704, + 0.06219112128019333, + 0.06102055683732033, + 0.05946978181600571, + 0.057958412915468216, + 0.056293632835149765, + 0.054419659078121185, + 0.05260806903243065, + 0.05094055086374283, + 0.04968404024839401, + 0.0484585277736187, + 0.0472632497549057, + 0.04576045274734497, + 0.044282156974077225, + 0.04285161569714546, + 0.04067574068903923, + 0.03823329135775566, + 0.03593750298023224, + 0.034224484115839005, + 0.03331591561436653, + 0.0324314646422863, + 0.03156014531850815, + 0.030570276081562042, + 0.029611455276608467, + 0.028682706877589226, + 0.028127474710345268, + 0.02770264632999897, + 0.014994435012340546, + 0.01565409265458584, + 0.016341030597686768, + 0.016903549432754517, + 0.01748543232679367, + 0.01797647774219513, + 0.01818721741437912, + 0.01840042509138584, + 0.018528571352362633, + 0.018578873947262764, + 0.01862931251525879, + 0.019244331866502762, + 0.020065659657120705, + 0.020922040566802025, + 0.021405775099992752, + 0.021892521530389786, + 0.022410767152905464, + 0.02303425595164299, + 0.023675093427300453, + 0.02420974336564541, + 0.02454337291419506, + 0.024881597608327866, + 0.025356167927384377, + 0.025953207165002823, + 0.026564303785562515, + 0.026985226199030876, + 0.027323761954903603, + 0.027666548267006874, + 0.028250668197870255, + 0.028893940150737762, + 0.029551861807703972, + 0.030115004628896713, + 0.03068448416888714, + 0.03123612515628338, + 0.03141006454825401, + 0.0315849743783474, + 0.03188841789960861, + 0.032876983284950256, + 0.03389619663357735, + 0.03480982407927513, + 0.03529365733265877, + 0.03578421473503113, + 0.03641539439558983, + 0.037387825548648834, + 0.03838622570037842, + 0.03904791176319122, + 0.03899674490094185, + 0.03894564509391785, + 0.03917534276843071, + 0.0399140790104866, + 0.04066675156354904, + 0.04124957695603371, + 0.04152185469865799, + 0.04179592430591583, + 0.04239408299326897, + 0.043590523302555084, + 0.04482072591781616, + 0.0461033470928669, + 0.04745909199118614, + 0.048854708671569824, + 0.04964078217744827, + 0.048861436545848846, + 0.04809432476758957, + 0.04739481210708618, + 0.04688849300146103, + 0.04638758674263954, + 0.04621569439768791, + 0.04786406457424164, + 0.04957123100757599, + 0.05115152522921562, + 0.04978443309664726, + 0.04845387116074562, + 0.04715887829661369, + 0.04723886027932167, + 0.04739530012011528, + 0.04755225405097008, + 0.04755505174398422, + 0.0475233793258667, + 0.04749172553420067, + 0.04691118746995926, + 0.046073395758867264, + 0.04525056853890419, + 0.044908467680215836, + 0.04502621293067932, + 0.045144274830818176, + 0.045097291469573975, + 0.04470564052462578, + 0.04431739076972008, + 0.043915122747421265, + 0.04339265078306198, + 0.04287640005350113, + 0.04236628860235214, + 0.04150136560201645, + 0.04061640426516533, + 0.039750318974256516, + 0.03954140469431877, + 0.039655592292547226, + 0.03977011516690254, + 0.039099641144275665, + 0.03736158832907677, + 0.03570079803466797, + 0.034274887293577194, + 0.03389023244380951, + 0.03350989893078804, + 0.03313382714986801, + 0.03302910178899765, + 0.032973457127809525, + 0.03291790559887886, + 0.032332345843315125, + 0.031312137842178345, + 0.030324116349220276, + 0.029416685923933983, + 0.028721647337079048, + 0.015416440553963184, + 0.015819882974028587, + 0.016233883798122406, + 0.016590330749750137, + 0.016903018578886986, + 0.017221599817276, + 0.01754038780927658, + 0.017863929271697998, + 0.018193507567048073, + 0.018529905006289482, + 0.018872521817684174, + 0.019290531054139137, + 0.019870661199092865, + 0.02046823687851429, + 0.021282004192471504, + 0.022309862077236176, + 0.023387361317873, + 0.023545704782009125, + 0.0233610849827528, + 0.023177912458777428, + 0.024418648332357407, + 0.02586161345243454, + 0.027237238362431526, + 0.027081048116087914, + 0.02692575380206108, + 0.026979729533195496, + 0.027699729427695274, + 0.02843894250690937, + 0.029242370277643204, + 0.030143672600388527, + 0.03107275255024433, + 0.03182455524802208, + 0.03238476440310478, + 0.03295483440160751, + 0.03371628373861313, + 0.03461729362607002, + 0.035542383790016174, + 0.03612809628248215, + 0.03656056895852089, + 0.036998216062784195, + 0.03774797543883324, + 0.038609690964221954, + 0.03949107602238655, + 0.040967799723148346, + 0.042631518095731735, + 0.04436279460787773, + 0.044671133160591125, + 0.04473995417356491, + 0.044808875769376755, + 0.0454932376742363, + 0.04627273604273796, + 0.04706558585166931, + 0.047222644090652466, + 0.04729773476719856, + 0.04737294092774391, + 0.04841838777065277, + 0.049629684537649155, + 0.050871290266513824, + 0.050453782081604004, + 0.04974261298775673, + 0.049041472375392914, + 0.04894215986132622, + 0.04899052530527115, + 0.04903893917798996, + 0.04895762354135513, + 0.04883071035146713, + 0.0487041249871254, + 0.04869820177555084, + 0.048754699528217316, + 0.04881126433610916, + 0.04885533079504967, + 0.048889607191085815, + 0.04892391338944435, + 0.048558373004198074, + 0.047708477824926376, + 0.046873461455106735, + 0.04619123041629791, + 0.045817308127880096, + 0.04544641077518463, + 0.045042507350444794, + 0.04446123167872429, + 0.043887458741664886, + 0.043321091681718826, + 0.042996734380722046, + 0.04267559200525284, + 0.04235684499144554, + 0.041620563715696335, + 0.04080154746770859, + 0.03999864682555199, + 0.039424847811460495, + 0.03899576514959335, + 0.03857135772705078, + 0.037897735834121704, + 0.03684224560856819, + 0.03581615537405014, + 0.035031758248806, + 0.03550952300429344, + 0.035993799567222595, + 0.03648468479514122, + 0.03447767719626427, + 0.032294098287820816, + 0.030248811468482018, + 0.02952767163515091, + 0.029589857906103134, + 0.029652176424860954, + 0.029365450143814087, + 0.028349118307232857, + 0.027367958799004555, + 0.026421446353197098, + 0.025716887786984444, + 0.025031115859746933, + 0.024363631382584572, + 0.023919332772493362, + 0.015276261605322361, + 0.015697194263339043, + 0.016134360805153847, + 0.01655309461057186, + 0.016853388398885727, + 0.017159128561615944, + 0.01745806634426117, + 0.017747199162840843, + 0.01804112084209919, + 0.01849110797047615, + 0.019018813967704773, + 0.019561581313610077, + 0.020279372110962868, + 0.021035833284258842, + 0.021754365414381027, + 0.022098740562796593, + 0.022448569536209106, + 0.02291952073574066, + 0.023627322167158127, + 0.024356981739401817, + 0.025206444784998894, + 0.026176391169428825, + 0.027183661237359047, + 0.02772638387978077, + 0.028055883944034576, + 0.028389299288392067, + 0.029329517856240273, + 0.030417094007134438, + 0.0315450020134449, + 0.0318349190056324, + 0.03210894763469696, + 0.0324525460600853, + 0.03343217447400093, + 0.034441377967596054, + 0.03539920598268509, + 0.036049984395504, + 0.03671272099018097, + 0.037530265748500824, + 0.038731466978788376, + 0.03997112065553665, + 0.040979839861392975, + 0.041517335921525955, + 0.04206187278032303, + 0.04313076287508011, + 0.045002974569797516, + 0.04695644602179527, + 0.04835807904601097, + 0.04899901524186134, + 0.04964844509959221, + 0.05019474774599075, + 0.05061786621809006, + 0.05104455351829529, + 0.0516279898583889, + 0.05239405483007431, + 0.053171489387750626, + 0.053372278809547424, + 0.052875492721796036, + 0.05238333344459534, + 0.052068497985601425, + 0.051989421248435974, + 0.05191046744585037, + 0.05248381942510605, + 0.05417406186461449, + 0.05591874197125435, + 0.05669792741537094, + 0.055261626839637756, + 0.05386170744895935, + 0.05275381729006767, + 0.05252378433942795, + 0.05229475721716881, + 0.05193757265806198, + 0.050727032124996185, + 0.04954470694065094, + 0.04839332401752472, + 0.04754086583852768, + 0.04670341685414314, + 0.04588072746992111, + 0.04508496820926666, + 0.04430471360683441, + 0.04353797063231468, + 0.04317037761211395, + 0.042952053248882294, + 0.04273483157157898, + 0.041664693504571915, + 0.039964742958545685, + 0.03833415359258652, + 0.03701205924153328, + 0.03614303097128868, + 0.03529440611600876, + 0.03447067737579346, + 0.03369159996509552, + 0.032930128276348114, + 0.0321858674287796, + 0.031510062515735626, + 0.03085189498960972, + 0.030207471922039986, + 0.029260681942105293, + 0.02820964902639389, + 0.02719637006521225, + 0.02658122219145298, + 0.026449749246239662, + 0.026318924501538277, + 0.026070162653923035, + 0.02518942393362522, + 0.024338437244296074, + 0.023516200482845306, + 0.023147137835621834, + 0.02285456843674183, + 0.022565698251128197, + 0.022008821368217468, + 0.021243229508399963, + 0.02050427347421646, + 0.019857212901115417, + 0.013782481662929058, + 0.014160875231027603, + 0.014700055122375488, + 0.015259764157235622, + 0.015824902802705765, + 0.016408568248152733, + 0.016925331205129623, + 0.016868507489562035, + 0.016811873763799667, + 0.016890225932002068, + 0.017196813598275185, + 0.017508966848254204, + 0.018085500225424767, + 0.018858835101127625, + 0.01966523565351963, + 0.020360704511404037, + 0.021046916022896767, + 0.021752512082457542, + 0.02217799797654152, + 0.02261180803179741, + 0.023077530786395073, + 0.02365283854305744, + 0.024242490530014038, + 0.024986783042550087, + 0.026014164090156555, + 0.02708378992974758, + 0.027886714786291122, + 0.02840634435415268, + 0.028935657814145088, + 0.030514661222696304, + 0.03281227871775627, + 0.03528289496898651, + 0.0365312397480011, + 0.03736783564090729, + 0.038223594427108765, + 0.038638148456811905, + 0.03898050636053085, + 0.03932589292526245, + 0.03998372331261635, + 0.04067200422286987, + 0.04137886315584183, + 0.04279668629169464, + 0.0442630909383297, + 0.045732926577329636, + 0.04651365801692009, + 0.04730771854519844, + 0.048264551907777786, + 0.0507044792175293, + 0.05326774716377258, + 0.05559427663683891, + 0.055121276527643204, + 0.05465230345726013, + 0.05438614264130592, + 0.05567474663257599, + 0.05699387937784195, + 0.058318931609392166, + 0.059438761323690414, + 0.06058009713888168, + 0.06163325160741806, + 0.06113956496119499, + 0.06064982712268829, + 0.06018814444541931, + 0.06121733412146568, + 0.06226412579417229, + 0.063328817486763, + 0.061745066195726395, + 0.06006412208080292, + 0.05842894688248634, + 0.05757377669215202, + 0.0568455271422863, + 0.05612649396061897, + 0.05490909144282341, + 0.053564589470624924, + 0.052253011614084244, + 0.05087464302778244, + 0.049479346722364426, + 0.04812231659889221, + 0.04663503170013428, + 0.0450361929833889, + 0.04349217191338539, + 0.041934505105018616, + 0.040314752608537674, + 0.0387575626373291, + 0.03732927888631821, + 0.03625744581222534, + 0.03521638363599777, + 0.03420522063970566, + 0.03301744908094406, + 0.0318688303232193, + 0.03076016902923584, + 0.029758168384432793, + 0.028807276859879494, + 0.02788677252829075, + 0.026918534189462662, + 0.025924352928996086, + 0.0249668899923563, + 0.02418670803308487, + 0.023739099502563477, + 0.023299774155020714, + 0.022864237427711487, + 0.022352078929543495, + 0.021851394325494766, + 0.021361924707889557, + 0.020560991019010544, + 0.019696557894349098, + 0.01886846497654915, + 0.01810559630393982, + 0.01740693859755993, + 0.016735240817070007, + 0.01616044156253338, + 0.01600373163819313, + 0.015848539769649506, + 0.01569485291838646, + 0.01098793838173151, + 0.01151216309517622, + 0.011589686386287212, + 0.011667733080685139, + 0.01191703137010336, + 0.012285142205655575, + 0.01266462355852127, + 0.012950198724865913, + 0.01322560478001833, + 0.01353548001497984, + 0.014096133410930634, + 0.01468000840395689, + 0.015251945704221725, + 0.01577187515795231, + 0.016309529542922974, + 0.01692141406238079, + 0.017604677006602287, + 0.018315527588129044, + 0.01887805201113224, + 0.019394470378756523, + 0.019925011321902275, + 0.02062957175076008, + 0.02137339860200882, + 0.02216172404587269, + 0.02318042889237404, + 0.024245956912636757, + 0.02525138296186924, + 0.025924520567059517, + 0.026615602895617485, + 0.02759869210422039, + 0.02912330999970436, + 0.03073214739561081, + 0.032282184809446335, + 0.033741794526576996, + 0.03526740148663521, + 0.03640339523553848, + 0.03723262995481491, + 0.03808075189590454, + 0.03939209505915642, + 0.04098765179514885, + 0.0426478311419487, + 0.04477255046367645, + 0.04716169089078903, + 0.04967832192778587, + 0.05117470771074295, + 0.05237666144967079, + 0.053606852889060974, + 0.05539058893918991, + 0.05736294016242027, + 0.059405528008937836, + 0.0612393356859684, + 0.06306823343038559, + 0.06495174765586853, + 0.0666152611374855, + 0.06826106458902359, + 0.06994752585887909, + 0.07079702615737915, + 0.07144532352685928, + 0.07209955900907516, + 0.07415594905614853, + 0.07669986039400101, + 0.07933103293180466, + 0.07897930592298508, + 0.07747413218021393, + 0.07599763572216034, + 0.07405398786067963, + 0.07190362364053726, + 0.06981569528579712, + 0.0679892897605896, + 0.0663611963391304, + 0.0647720918059349, + 0.06290478259325027, + 0.060736022889614105, + 0.05864203721284866, + 0.05614945665001869, + 0.05290347337722778, + 0.049845140427351, + 0.04691481590270996, + 0.043976668268442154, + 0.04122253134846687, + 0.03865372762084007, + 0.036492910236120224, + 0.034452881664037704, + 0.032526895403862, + 0.030761539936065674, + 0.029099320992827415, + 0.027526920661330223, + 0.02630288153886795, + 0.02525229938328266, + 0.024243680760264397, + 0.023087164387106895, + 0.02178589440882206, + 0.020557967945933342, + 0.019496221095323563, + 0.018779559060931206, + 0.018089240416884422, + 0.017424296587705612, + 0.017115171998739243, + 0.01681276224553585, + 0.01651569828391075, + 0.015748538076877594, + 0.014854189939796925, + 0.01401063147932291, + 0.013415666297078133, + 0.013085983693599701, + 0.01276440266519785, + 0.012442639097571373, + 0.012083492241799831, + 0.011734711937606335, + 0.011395998299121857, + 0.010941410437226295, + 0.01047994289547205, + 0.010037937201559544, + 0.009460345841944218, + 0.009724415838718414, + 0.010201387107372284, + 0.010701753199100494, + 0.011129412800073624, + 0.011425931937992573, + 0.011730349622666836, + 0.01197152677923441, + 0.012180215679109097, + 0.012392543256282806, + 0.013077350333333015, + 0.013855875469744205, + 0.014592801220715046, + 0.014739951118826866, + 0.014888584613800049, + 0.015252440236508846, + 0.01606813631951809, + 0.016927454620599747, + 0.01757413148880005, + 0.018010206520557404, + 0.01845710165798664, + 0.019150499254465103, + 0.019971732050180435, + 0.020828181877732277, + 0.02175142988562584, + 0.022720299661159515, + 0.023731518536806107, + 0.024736568331718445, + 0.02578418329358101, + 0.026922062039375305, + 0.0283910371363163, + 0.02994016371667385, + 0.03140553832054138, + 0.03244655951857567, + 0.03352208808064461, + 0.034655798226594925, + 0.03586961328983307, + 0.03712594509124756, + 0.03872628137469292, + 0.04079807549715042, + 0.04298070818185806, + 0.045137710869312286, + 0.04725657030940056, + 0.04947490245103836, + 0.05141190066933632, + 0.05310310423374176, + 0.05484993755817413, + 0.056599389761686325, + 0.058364469558000565, + 0.06018459051847458, + 0.06242971122264862, + 0.0650148093700409, + 0.06770695745944977, + 0.06998522579669952, + 0.07197719812393188, + 0.07402586936950684, + 0.0756615698337555, + 0.07698524743318558, + 0.0783320888876915, + 0.07908133417367935, + 0.07931458204984665, + 0.07954851537942886, + 0.08038334548473358, + 0.08186164498329163, + 0.08336712419986725, + 0.08259568363428116, + 0.07878575474023819, + 0.07515157759189606, + 0.07256709784269333, + 0.07180843502283096, + 0.07105770707130432, + 0.06948911398649216, + 0.0652952790260315, + 0.06135454773902893, + 0.05762046203017235, + 0.05386726185679436, + 0.05035853013396263, + 0.04707834869623184, + 0.044357672333717346, + 0.041805703192949295, + 0.039400551468133926, + 0.03704532980918884, + 0.03481123223900795, + 0.03271186724305153, + 0.030563103035092354, + 0.028460633009672165, + 0.02650279551744461, + 0.02455846406519413, + 0.022614585235714912, + 0.02082456462085247, + 0.01936572976410389, + 0.018617045134305954, + 0.01789730414748192, + 0.017205387353897095, + 0.016269905492663383, + 0.015385054983198643, + 0.014548327773809433, + 0.01391515787690878, + 0.013359916396439075, + 0.0128268301486969, + 0.012346037663519382, + 0.01191498339176178, + 0.011498978361487389, + 0.01109246350824833, + 0.010681072250008583, + 0.010284936986863613, + 0.009903495199978352, + 0.009602566249668598, + 0.00931808352470398, + 0.009042030200362206, + 0.008716639131307602, + 0.008362533524632454, + 0.008022812195122242, + 0.008433613926172256, + 0.008782885037362576, + 0.009183833375573158, + 0.009603681974112988, + 0.01000751182436943, + 0.010322376154363155, + 0.010647145099937916, + 0.010963328182697296, + 0.011270440183579922, + 0.01158615481108427, + 0.012143513187766075, + 0.012809350155293941, + 0.013511694967746735, + 0.014024556614458561, + 0.014551158994436264, + 0.015074701979756355, + 0.015513354912400246, + 0.015964772552251816, + 0.01651955395936966, + 0.017248189076781273, + 0.018008964136242867, + 0.018720652908086777, + 0.019392022863030434, + 0.02008747309446335, + 0.02098124846816063, + 0.02198668010532856, + 0.023040294647216797, + 0.02468053810298443, + 0.026530306786298752, + 0.028518712148070335, + 0.029144836589694023, + 0.029772285372018814, + 0.030473170801997185, + 0.031718745827674866, + 0.03301522880792618, + 0.03435759246349335, + 0.03572526201605797, + 0.03714738041162491, + 0.03869099169969559, + 0.04047110304236412, + 0.04233311489224434, + 0.04417388513684273, + 0.045884933322668076, + 0.04766225442290306, + 0.049612149596214294, + 0.05180840194225311, + 0.05410187318921089, + 0.0569247230887413, + 0.06051011011004448, + 0.06432131677865982, + 0.06755038350820541, + 0.06985242664813995, + 0.0722329244017601, + 0.07490271329879761, + 0.07795119285583496, + 0.08112374693155289, + 0.08348540961742401, + 0.08457843959331512, + 0.08568577468395233, + 0.0867823138833046, + 0.08785104006528854, + 0.08893293142318726, + 0.08908071368932724, + 0.08729839324951172, + 0.08555173128843307, + 0.08404023945331573, + 0.08313268423080444, + 0.0822349414229393, + 0.08051633089780807, + 0.07489142566919327, + 0.06965948641300201, + 0.06492098420858383, + 0.062371205538511276, + 0.05992157384753227, + 0.05756814405322075, + 0.05281025171279907, + 0.048297178000211716, + 0.04416979104280472, + 0.04100080206990242, + 0.03820381686091423, + 0.03559763357043266, + 0.03279221057891846, + 0.03001287579536438, + 0.027469104155898094, + 0.025566907599568367, + 0.02426660992205143, + 0.023032445460557938, + 0.021767303347587585, + 0.02033129148185253, + 0.018990015611052513, + 0.017732590436935425, + 0.016484852880239487, + 0.0153249092400074, + 0.01424658577889204, + 0.013651331886649132, + 0.013165220618247986, + 0.012696418911218643, + 0.012417705729603767, + 0.012271236628293991, + 0.012126496061682701, + 0.011772353202104568, + 0.010984393768012524, + 0.010249175131320953, + 0.009570373222231865, + 0.009211485274136066, + 0.008866055868566036, + 0.008533581160008907, + 0.008122526109218597, + 0.00769790168851614, + 0.0072954753413796425, + 0.00703049823641777, + 0.0069484771229326725, + 0.006867412943392992, + 0.007785170804709196, + 0.008144238963723183, + 0.008389127440750599, + 0.008626080118119717, + 0.008907382376492023, + 0.00939338468015194, + 0.009905902668833733, + 0.010208167135715485, + 0.01019346248358488, + 0.010178779251873493, + 0.010504871606826782, + 0.011025185696780682, + 0.01157127134501934, + 0.012100142426788807, + 0.012647266499698162, + 0.013242135755717754, + 0.014097139239311218, + 0.01500734779983759, + 0.015873536467552185, + 0.016523238271474838, + 0.017199531197547913, + 0.017733730375766754, + 0.018084600567817688, + 0.018442410975694656, + 0.019182544201612473, + 0.020190101116895676, + 0.021250581368803978, + 0.02275148034095764, + 0.024482708424329758, + 0.026345670223236084, + 0.02719314768910408, + 0.027936702594161034, + 0.028706436976790428, + 0.030016442760825157, + 0.031386230140924454, + 0.032831914722919464, + 0.03446023166179657, + 0.036169301718473434, + 0.038081519305706024, + 0.04063818231225014, + 0.04336648806929588, + 0.045885976403951645, + 0.047337472438812256, + 0.04883487522602081, + 0.05075377598404884, + 0.053673747926950455, + 0.056761711835861206, + 0.06014241650700569, + 0.0639742761850357, + 0.06805028021335602, + 0.07204172760248184, + 0.075571708381176, + 0.07927466183900833, + 0.08232585340738297, + 0.08383191376924515, + 0.08536552637815475, + 0.08845964074134827, + 0.09515395760536194, + 0.10235486924648285, + 0.10664451867341995, + 0.10242883861064911, + 0.09837982058525085, + 0.09536143392324448, + 0.09536420553922653, + 0.09536697715520859, + 0.09435960650444031, + 0.0881238654255867, + 0.08230021595954895, + 0.07688982784748077, + 0.07220686972141266, + 0.06780911982059479, + 0.06367921829223633, + 0.06017050892114639, + 0.05686953663825989, + 0.053749650716781616, + 0.048667922616004944, + 0.0436992309987545, + 0.03923781216144562, + 0.0359492227435112, + 0.03322849050164223, + 0.030713671818375587, + 0.028470057994127274, + 0.026455366984009743, + 0.0245832446962595, + 0.022728975862264633, + 0.020826857537031174, + 0.019083920866250992, + 0.017606427893042564, + 0.016815785318613052, + 0.01606064662337303, + 0.01533941924571991, + 0.014418930746614933, + 0.013542674481868744, + 0.012719670310616493, + 0.012103354558348656, + 0.0115752462297678, + 0.011070182546973228, + 0.010512965731322765, + 0.009905370883643627, + 0.009332891553640366, + 0.008843209594488144, + 0.008565698750317097, + 0.008296895772218704, + 0.008036528714001179, + 0.007623075041919947, + 0.0072173778899014, + 0.006833272520452738, + 0.006558308377861977, + 0.006348627153784037, + 0.0061456491239368916, + 0.005950013175606728, + 0.005762622691690922, + 0.005581133533269167, + 0.013555307872593403, + 0.013865777291357517, + 0.014248213730752468, + 0.01465136930346489, + 0.015041136182844639, + 0.015283492393791676, + 0.01552975457161665, + 0.01583533175289631, + 0.01623442955315113, + 0.0166435856372118, + 0.01731850765645504, + 0.018177002668380737, + 0.019078057259321213, + 0.019774749875068665, + 0.020453941076993942, + 0.02117530256509781, + 0.022206127643585205, + 0.023287134245038033, + 0.024290641769766808, + 0.024949418380856514, + 0.025626063346862793, + 0.026473335921764374, + 0.027555298060178757, + 0.028681475669145584, + 0.030320746824145317, + 0.032394830137491226, + 0.03461078554391861, + 0.03553963825106621, + 0.035986363887786865, + 0.036438699811697006, + 0.03773949295282364, + 0.03922121599316597, + 0.04076111689209938, + 0.04141627252101898, + 0.04206297919154167, + 0.04281695932149887, + 0.04479537159204483, + 0.04686519876122475, + 0.0489751435816288, + 0.05086822062730789, + 0.05283446982502937, + 0.05443170294165611, + 0.054478969424963, + 0.054526276886463165, + 0.0554330050945282, + 0.05883065611124039, + 0.06243656575679779, + 0.06471293419599533, + 0.06341005861759186, + 0.062133416533470154, + 0.06207136809825897, + 0.06473663449287415, + 0.06751634180545807, + 0.0693449005484581, + 0.0687972754240036, + 0.06825397163629532, + 0.067705899477005, + 0.06713981181383133, + 0.0665784627199173, + 0.06609242409467697, + 0.0658220648765564, + 0.06555281579494476, + 0.06502623856067657, + 0.06345155090093613, + 0.061914991587400436, + 0.060497116297483444, + 0.05968482419848442, + 0.05888344347476959, + 0.058066148310899734, + 0.05650626868009567, + 0.05498829111456871, + 0.05351109802722931, + 0.051306020468473434, + 0.04913431778550148, + 0.04705454409122467, + 0.045001320540905, + 0.04302327707409859, + 0.041132181882858276, + 0.038685016334056854, + 0.03607948496937752, + 0.033649444580078125, + 0.031570933759212494, + 0.029796630144119263, + 0.02812204137444496, + 0.026576856151223183, + 0.02518598921597004, + 0.023867910727858543, + 0.022620661184191704, + 0.021450331434607506, + 0.02034054882824421, + 0.019288185983896255, + 0.018672645092010498, + 0.018110694363713264, + 0.0175656545907259, + 0.016947245225310326, + 0.016311058774590492, + 0.015698757022619247, + 0.015076148323714733, + 0.014437034726142883, + 0.013825015164911747, + 0.013248208910226822, + 0.012739332392811775, + 0.012250001542270184, + 0.01177946850657463, + 0.011401298455893993, + 0.011044875718653202, + 0.010699596256017685, + 0.010543721728026867, + 0.010520583018660545, + 0.010497493669390678, + 0.010401918552815914, + 0.010099641047418118, + 0.009806147776544094, + 0.013711241073906422, + 0.014186915941536427, + 0.015058638527989388, + 0.016030754894018173, + 0.01690344698727131, + 0.016998369246721268, + 0.017093826085329056, + 0.017510874196887016, + 0.018397126346826553, + 0.01932823471724987, + 0.02009851485490799, + 0.02079012058675289, + 0.02150552347302437, + 0.02245502918958664, + 0.023474637418985367, + 0.02461232803761959, + 0.026535004377365112, + 0.02860787697136402, + 0.03017452359199524, + 0.030145231634378433, + 0.030115967616438866, + 0.030228998512029648, + 0.030508069321513176, + 0.030789712443947792, + 0.0321994349360466, + 0.034399695694446564, + 0.03675030916929245, + 0.038158439099788666, + 0.039284899830818176, + 0.04044461250305176, + 0.04070635512471199, + 0.04086564853787422, + 0.0410415455698967, + 0.04261672496795654, + 0.04425235465168953, + 0.045997943729162216, + 0.048219889402389526, + 0.05054916441440582, + 0.05254991352558136, + 0.05269109457731247, + 0.05283266305923462, + 0.053426362574100494, + 0.05541025102138519, + 0.057467807084321976, + 0.058867212384939194, + 0.058567773550748825, + 0.058269865810871124, + 0.05852242186665535, + 0.0599185936152935, + 0.061348073184490204, + 0.06247621774673462, + 0.06297363340854645, + 0.06347502022981644, + 0.06364656984806061, + 0.06317083537578583, + 0.06269865483045578, + 0.06269939243793488, + 0.0637151449918747, + 0.06474734842777252, + 0.06482041627168655, + 0.06246571987867355, + 0.060196563601493835, + 0.058339353650808334, + 0.05763914808630943, + 0.05694735422730446, + 0.05614154040813446, + 0.054697684943675995, + 0.0532909594476223, + 0.051950547844171524, + 0.05105609446763992, + 0.050177041441202164, + 0.04931312054395676, + 0.04729596525430679, + 0.04531583562493324, + 0.043418604880571365, + 0.04151245579123497, + 0.03967352584004402, + 0.03791605308651924, + 0.03624316304922104, + 0.0346469022333622, + 0.03312094509601593, + 0.03168477490544319, + 0.03032957948744297, + 0.029032345861196518, + 0.0275433249771595, + 0.025717418640851974, + 0.024012556299567223, + 0.02253628522157669, + 0.02171071618795395, + 0.02091539092361927, + 0.020149201154708862, + 0.019542092457413673, + 0.0189597737044096, + 0.01839480549097061, + 0.017659470438957214, + 0.01688433438539505, + 0.016143223270773888, + 0.015572362579405308, + 0.015172086656093597, + 0.014782099984586239, + 0.014400630258023739, + 0.014023274183273315, + 0.013655808754265308, + 0.013297970406711102, + 0.012924334965646267, + 0.01255901250988245, + 0.01220401655882597, + 0.01183362863957882, + 0.011458980850875378, + 0.011096194386482239, + 0.010752753354609013, + 0.010438570752739906, + 0.01013356726616621, + 0.014221303164958954, + 0.014932512305676937, + 0.015437391586601734, + 0.01595555618405342, + 0.01656249724328518, + 0.0174097940325737, + 0.018300436437129974, + 0.019016316160559654, + 0.019544027745723724, + 0.02008638344705105, + 0.020955506712198257, + 0.02197076752781868, + 0.023035217076539993, + 0.02396784909069538, + 0.024933597072958946, + 0.026023948565125465, + 0.027559254318475723, + 0.029185136780142784, + 0.03024710901081562, + 0.030255300924181938, + 0.030263496562838554, + 0.031069155782461166, + 0.0325666218996048, + 0.03413626179099083, + 0.03553536534309387, + 0.0368911512196064, + 0.03829866275191307, + 0.03953013941645622, + 0.04076351970434189, + 0.042035385966300964, + 0.04312482476234436, + 0.044240619987249374, + 0.045301299542188644, + 0.04566028341650963, + 0.04602211341261864, + 0.04659634083509445, + 0.04802631959319115, + 0.04950018227100372, + 0.051153503358364105, + 0.05321634188294411, + 0.05536236986517906, + 0.05678403377532959, + 0.05670446529984474, + 0.05662500113248825, + 0.05698534473776817, + 0.05803557112812996, + 0.059105150401592255, + 0.06040417030453682, + 0.06202328950166702, + 0.06368580460548401, + 0.06434065103530884, + 0.0636676773428917, + 0.06300174444913864, + 0.062151286751031876, + 0.061068907380104065, + 0.06000537797808647, + 0.05961507931351662, + 0.060150910168886185, + 0.060691557824611664, + 0.06032583490014076, + 0.058512069284915924, + 0.05675283446907997, + 0.05517254397273064, + 0.05389048531651497, + 0.0526382252573967, + 0.051430173218250275, + 0.05029301345348358, + 0.04918099567294121, + 0.04815388470888138, + 0.04744456335902214, + 0.04674569517374039, + 0.04604028910398483, + 0.045091066509485245, + 0.04416140913963318, + 0.043250925838947296, + 0.04092876613140106, + 0.03864302113652229, + 0.03648493066430092, + 0.03480103239417076, + 0.03328138217329979, + 0.03182808682322502, + 0.030398765578866005, + 0.0290122851729393, + 0.027689041569828987, + 0.026666054502129555, + 0.025952555239200592, + 0.025258146226406097, + 0.024487992748618126, + 0.023493008688092232, + 0.022538449615240097, + 0.021614816039800644, + 0.020601006224751472, + 0.01963474415242672, + 0.018713803961873055, + 0.017911501228809357, + 0.01715894602239132, + 0.016438009217381477, + 0.016048716381192207, + 0.015888389199972153, + 0.015729663893580437, + 0.015371930785477161, + 0.014594189822673798, + 0.013855798169970512, + 0.013175125233829021, + 0.013332157395780087, + 0.013491060584783554, + 0.01365185808390379, + 0.013148562051355839, + 0.012423313222825527, + 0.0117380665615201, + 0.011309406720101833, + 0.011223267763853073, + 0.011137785390019417, + 0.01555425114929676, + 0.016199225559830666, + 0.016954056918621063, + 0.01774406060576439, + 0.01852557435631752, + 0.019271645694971085, + 0.020047761499881744, + 0.020787052810192108, + 0.021517232060432434, + 0.02227306179702282, + 0.023304618895053864, + 0.024412985891103745, + 0.025502696633338928, + 0.026128290221095085, + 0.026769228279590607, + 0.027380842715501785, + 0.027915388345718384, + 0.028460368514060974, + 0.029280534014105797, + 0.030368270352482796, + 0.03149641305208206, + 0.0327909030020237, + 0.034192249178886414, + 0.0356534868478775, + 0.0369330458343029, + 0.038220860064029694, + 0.039547137916088104, + 0.040518149733543396, + 0.041513003408908844, + 0.04251564294099808, + 0.043443307280540466, + 0.044391222298145294, + 0.04547053202986717, + 0.046899616718292236, + 0.048373617231845856, + 0.04941803216934204, + 0.04962548241019249, + 0.04983380436897278, + 0.05059419199824333, + 0.05208851397037506, + 0.05362697318196297, + 0.05445476993918419, + 0.05455164983868599, + 0.054648712277412415, + 0.054929301142692566, + 0.05536077544093132, + 0.055795639753341675, + 0.056402381509542465, + 0.05713699758052826, + 0.0578811839222908, + 0.057750023901462555, + 0.057037148624658585, + 0.05633307248353958, + 0.055727265775203705, + 0.055187661200761795, + 0.05465327575802803, + 0.05458870157599449, + 0.05486393719911575, + 0.055140554904937744, + 0.05498666316270828, + 0.054473888128995895, + 0.053965892642736435, + 0.053338199853897095, + 0.05259038507938385, + 0.05185304582118988, + 0.05059435963630676, + 0.04866006597876549, + 0.04679972678422928, + 0.04563700780272484, + 0.04575205594301224, + 0.04586739093065262, + 0.04555658996105194, + 0.04384512081742287, + 0.04219794645905495, + 0.04064148664474487, + 0.03937741369009018, + 0.038152653723955154, + 0.0369659885764122, + 0.035661861300468445, + 0.03439852595329285, + 0.03317994996905327, + 0.0316922627389431, + 0.030201071873307228, + 0.028780046850442886, + 0.027588048949837685, + 0.026535911485552788, + 0.025523902848362923, + 0.02478138543665409, + 0.024349018931388855, + 0.023924198001623154, + 0.02346806973218918, + 0.022892862558364868, + 0.022331751883029938, + 0.021784396842122078, + 0.020943691954016685, + 0.020135167986154556, + 0.01935785636305809, + 0.01902829110622406, + 0.018842142075300217, + 0.01865781471133232, + 0.018162742257118225, + 0.017364103347063065, + 0.016600582748651505, + 0.015965688973665237, + 0.015723340213298798, + 0.01548466831445694, + 0.015249621123075485, + 0.01506396010518074, + 0.014885683543980122, + 0.014709515497088432, + 0.014410401694476604, + 0.014028220437467098, + 0.013656174764037132, + 0.01808208040893078, + 0.01880408078432083, + 0.019129512831568718, + 0.01946057379245758, + 0.01993747428059578, + 0.020518915727734566, + 0.02111731469631195, + 0.022060668095946312, + 0.02309948019683361, + 0.024116579443216324, + 0.024579377844929695, + 0.02505105920135975, + 0.02567308023571968, + 0.02660057321190834, + 0.027561573311686516, + 0.02846236154437065, + 0.029311247169971466, + 0.030185451731085777, + 0.031212786212563515, + 0.03232114017009735, + 0.03346885368227959, + 0.034840382635593414, + 0.036284659057855606, + 0.03765404596924782, + 0.0375787578523159, + 0.037503618746995926, + 0.03763052821159363, + 0.03843884915113449, + 0.039264529943466187, + 0.04017287492752075, + 0.04121916741132736, + 0.04229270666837692, + 0.04309293255209923, + 0.043575458228588104, + 0.04406338930130005, + 0.045254942029714584, + 0.047011617571115494, + 0.04883647710084915, + 0.04963770881295204, + 0.04988733306527138, + 0.050138212740421295, + 0.05022662505507469, + 0.05025336146354675, + 0.050280116498470306, + 0.05040517821907997, + 0.05055912956595421, + 0.05071354657411575, + 0.05106998234987259, + 0.05147715285420418, + 0.05188756436109543, + 0.05213891714811325, + 0.05235688015818596, + 0.05257574841380119, + 0.05210571363568306, + 0.05149514228105545, + 0.050891727209091187, + 0.05067030340433121, + 0.05053972080349922, + 0.050409477204084396, + 0.050518009811639786, + 0.050697486847639084, + 0.05087760463356972, + 0.050338491797447205, + 0.049531690776348114, + 0.048737820237874985, + 0.047399673610925674, + 0.04581156000494957, + 0.0442766509950161, + 0.04356497898697853, + 0.04345683380961418, + 0.04334895312786102, + 0.04255809262394905, + 0.04101480916142464, + 0.039527490735054016, + 0.03832358494400978, + 0.03758949413895607, + 0.03686946630477905, + 0.03629244491457939, + 0.0362289622426033, + 0.036165595054626465, + 0.03605670854449272, + 0.03502838313579559, + 0.03402937948703766, + 0.03305887058377266, + 0.031955596059560776, + 0.030866533517837524, + 0.0298145841807127, + 0.029123928397893906, + 0.028599748387932777, + 0.028085004538297653, + 0.027419574558734894, + 0.026595279574394226, + 0.025795767083764076, + 0.025064129382371902, + 0.024486804381012917, + 0.02392277680337429, + 0.02337174117565155, + 0.023007553070783615, + 0.02264968678355217, + 0.022297386080026627, + 0.021825140342116356, + 0.021318063139915466, + 0.020822767168283463, + 0.020566426217556, + 0.020592592656612396, + 0.02061879076063633, + 0.020550105720758438, + 0.01994280517101288, + 0.01935344934463501, + 0.0187815111130476, + 0.018357278779149055, + 0.017969438806176186, + 0.017589790746569633, + 0.016963180154561996, + 0.017632227391004562, + 0.01884162798523903, + 0.020133981481194496, + 0.020153842866420746, + 0.0199821088463068, + 0.01996660977602005, + 0.02100188285112381, + 0.022090835496783257, + 0.022842906415462494, + 0.0229586623609066, + 0.023075005039572716, + 0.02351577952504158, + 0.02418447658419609, + 0.0248721893876791, + 0.025745375081896782, + 0.02668815664947033, + 0.02766399271786213, + 0.02855496294796467, + 0.02947462908923626, + 0.03034859336912632, + 0.030927076935768127, + 0.03151658922433853, + 0.032208092510700226, + 0.03308146819472313, + 0.03397852182388306, + 0.03470071777701378, + 0.03524193540215492, + 0.03579159826040268, + 0.036918506026268005, + 0.03841418772935867, + 0.03997046500444412, + 0.04058987647294998, + 0.04089854285120964, + 0.04120955616235733, + 0.042362067848443985, + 0.043691497296094894, + 0.045062653720378876, + 0.04642803221940994, + 0.04783168435096741, + 0.04926071688532829, + 0.04898442327976227, + 0.0487096831202507, + 0.04848971217870712, + 0.04909326881170273, + 0.04970433935523033, + 0.050233207643032074, + 0.049917034804821014, + 0.04960285499691963, + 0.049387913197278976, + 0.049936797469854355, + 0.050491780042648315, + 0.051050011068582535, + 0.05159158632159233, + 0.052138909697532654, + 0.05253291875123978, + 0.05148935317993164, + 0.05046650767326355, + 0.04950236529111862, + 0.049093108624219894, + 0.04868723452091217, + 0.04827343299984932, + 0.047182369977235794, + 0.04611596465110779, + 0.04507366195321083, + 0.0443975105881691, + 0.04374973475933075, + 0.0431114099919796, + 0.04248085245490074, + 0.041859280318021774, + 0.04124680534005165, + 0.04099481925368309, + 0.04085367172956467, + 0.04071300849318504, + 0.04022533819079399, + 0.039554525166749954, + 0.0388948991894722, + 0.038374435156583786, + 0.03798449784517288, + 0.03759852796792984, + 0.03732207417488098, + 0.03724135458469391, + 0.037160806357860565, + 0.03692900389432907, + 0.03601955994963646, + 0.0351325124502182, + 0.034267306327819824, + 0.03354112058877945, + 0.03283154219388962, + 0.032136980444192886, + 0.031840965151786804, + 0.03165498003363609, + 0.03147008270025253, + 0.03083309344947338, + 0.029857603833079338, + 0.0289129801094532, + 0.02812310680747032, + 0.02762644551694393, + 0.02713855728507042, + 0.02665584534406662, + 0.02611449547111988, + 0.025584140792489052, + 0.025064554065465927, + 0.024718331173062325, + 0.024425985291600227, + 0.0241371002048254, + 0.02374853566288948, + 0.02325097657740116, + 0.022763840854167938, + 0.02227100543677807, + 0.021699944511055946, + 0.02114352397620678, + 0.02060137316584587, + 0.01527512725442648, + 0.015628689900040627, + 0.015962915495038033, + 0.016316093504428864, + 0.01672712154686451, + 0.01714850403368473, + 0.017521915957331657, + 0.017832178622484207, + 0.01814793422818184, + 0.018802929669618607, + 0.019630923867225647, + 0.020495379343628883, + 0.021223479881882668, + 0.021964093670248985, + 0.0226711668074131, + 0.02304326929152012, + 0.023421475663781166, + 0.023972613736987114, + 0.02486583963036537, + 0.02579234540462494, + 0.02653348445892334, + 0.027094081044197083, + 0.027666525915265083, + 0.028934726491570473, + 0.030582694336771965, + 0.032324522733688354, + 0.033154089003801346, + 0.033817097544670105, + 0.03449336439371109, + 0.03445039317011833, + 0.034392133355140686, + 0.0344143770635128, + 0.03518666699528694, + 0.035976286977529526, + 0.03699938952922821, + 0.03895003721117973, + 0.0410035215318203, + 0.042753517627716064, + 0.043526872992515564, + 0.04431421682238579, + 0.04449840262532234, + 0.043584588915109634, + 0.04268954321742058, + 0.042639873921871185, + 0.04381033033132553, + 0.04501291364431381, + 0.046004991978406906, + 0.04671162739396095, + 0.04742911085486412, + 0.047879867255687714, + 0.04801546409726143, + 0.048151448369026184, + 0.04814691096544266, + 0.0479833222925663, + 0.047820284962654114, + 0.047654591500759125, + 0.047485627233982086, + 0.0473172627389431, + 0.04701407253742218, + 0.046530891209840775, + 0.04605266824364662, + 0.045897793024778366, + 0.04627401754260063, + 0.04665333032608032, + 0.046755142509937286, + 0.04624118655920029, + 0.045732881873846054, + 0.04537469148635864, + 0.045505475252866745, + 0.045636631548404694, + 0.04567501321434975, + 0.045090366154909134, + 0.04451319947838783, + 0.04394907131791115, + 0.04385317116975784, + 0.04375747963786125, + 0.043661996722221375, + 0.04317772388458252, + 0.042645275592803955, + 0.04211939498782158, + 0.041956402361392975, + 0.041929613798856735, + 0.04190284386277199, + 0.04198705032467842, + 0.04216093197464943, + 0.04233553260564804, + 0.04208233207464218, + 0.04110445827245712, + 0.04014930501580238, + 0.03919726982712746, + 0.03817044198513031, + 0.03717051446437836, + 0.03619677945971489, + 0.03527466580271721, + 0.034377772361040115, + 0.033503688871860504, + 0.03258521109819412, + 0.031663376837968826, + 0.030767617747187614, + 0.030109146609902382, + 0.029738234356045723, + 0.029371894896030426, + 0.02892644703388214, + 0.02804066799581051, + 0.02718201093375683, + 0.026349646970629692, + 0.02615165337920189, + 0.02605748549103737, + 0.02596365660429001, + 0.025623181834816933, + 0.025082014501094818, + 0.024552276358008385, + 0.02402760647237301, + 0.01275724172592163, + 0.013352391310036182, + 0.01397530734539032, + 0.01433240994811058, + 0.014478559605777264, + 0.014626200310885906, + 0.015037845820188522, + 0.015514003112912178, + 0.016001233831048012, + 0.016459429636597633, + 0.016930745914578438, + 0.017346052452921867, + 0.017619172111153603, + 0.017896592617034912, + 0.018581032752990723, + 0.01966463215649128, + 0.020811427384614944, + 0.021178631111979485, + 0.021248966455459595, + 0.021319536492228508, + 0.022536884993314743, + 0.023933114483952522, + 0.02528991363942623, + 0.02539014257490635, + 0.02549077197909355, + 0.025770124047994614, + 0.02662653475999832, + 0.02751140668988228, + 0.028227683156728745, + 0.02863246761262417, + 0.029043052345514297, + 0.029960334300994873, + 0.0314326249063015, + 0.03297726809978485, + 0.0340074822306633, + 0.03467710316181183, + 0.035359907895326614, + 0.03554271534085274, + 0.035500023514032364, + 0.03545738384127617, + 0.03626977279782295, + 0.037373851984739304, + 0.03851153701543808, + 0.038889165967702866, + 0.03909697011113167, + 0.039305880665779114, + 0.04077660292387009, + 0.04252057150006294, + 0.044339124113321304, + 0.044206153601408005, + 0.04380831494927406, + 0.04341405630111694, + 0.04443658888339996, + 0.04567113518714905, + 0.04693998396396637, + 0.04695280268788338, + 0.046784598380327225, + 0.04661700502038002, + 0.04602528735995293, + 0.04536570981144905, + 0.04471558704972267, + 0.04553277790546417, + 0.046740248799324036, + 0.04797973856329918, + 0.047957394272089005, + 0.04748564958572388, + 0.04701855033636093, + 0.04684578999876976, + 0.04682387411594391, + 0.046801965683698654, + 0.04708348214626312, + 0.0476064458489418, + 0.04813521355390549, + 0.04853963479399681, + 0.048785291612148285, + 0.049032192677259445, + 0.049275510013103485, + 0.049509447067976, + 0.04974449425935745, + 0.04989590868353844, + 0.049617949873209, + 0.04934154078364372, + 0.04906667396426201, + 0.04914161190390587, + 0.04921784624457359, + 0.04929419979453087, + 0.04789048805832863, + 0.04619796946644783, + 0.044565267860889435, + 0.043545201420784, + 0.042902637273073196, + 0.04226955771446228, + 0.04196693375706673, + 0.04217913746833801, + 0.04239240661263466, + 0.042250581085681915, + 0.040091682225465775, + 0.03804308921098709, + 0.036099180579185486, + 0.03534264862537384, + 0.03473874554038048, + 0.034145161509513855, + 0.03329811617732048, + 0.03230984881520271, + 0.031350910663604736, + 0.030553633347153664, + 0.03005867637693882, + 0.029571738094091415, + 0.0290911253541708, + 0.028139516711235046, + 0.02721903845667839, + 0.026328667998313904, + 0.025688355788588524, + 0.01078345812857151, + 0.01067926175892353, + 0.010580568574368954, + 0.01086985133588314, + 0.011167043820023537, + 0.011506056413054466, + 0.011946420185267925, + 0.0124036381021142, + 0.01282542571425438, + 0.013212657533586025, + 0.013611581176519394, + 0.01401551254093647, + 0.014429164119064808, + 0.01485502440482378, + 0.01550359558314085, + 0.016184834763407707, + 0.016775792464613914, + 0.016846217215061188, + 0.01691693812608719, + 0.01714172028005123, + 0.01763632334768772, + 0.01814519613981247, + 0.01891038380563259, + 0.019922181963920593, + 0.020988116040825844, + 0.021981164813041687, + 0.022962823510169983, + 0.02398831956088543, + 0.024599935859441757, + 0.025137409567832947, + 0.025686627253890038, + 0.026166321709752083, + 0.026651710271835327, + 0.027180369943380356, + 0.02819209359586239, + 0.029241474345326424, + 0.030288565903902054, + 0.031150031834840775, + 0.03203599900007248, + 0.03282327577471733, + 0.033220332115888596, + 0.03362219035625458, + 0.034445296972990036, + 0.03633783757686615, + 0.03833435848355293, + 0.03946276009082794, + 0.03869624808430672, + 0.03794462978839874, + 0.0380484014749527, + 0.03970050811767578, + 0.041424356400966644, + 0.0423843078315258, + 0.041930269449949265, + 0.04148109629750252, + 0.041527099907398224, + 0.04246401786804199, + 0.04342207685112953, + 0.04473922401666641, + 0.04679965227842331, + 0.04895496740937233, + 0.05044456943869591, + 0.05010430887341499, + 0.04976635053753853, + 0.049425605684518814, + 0.04907044395804405, + 0.04871783405542374, + 0.04862026870250702, + 0.04993651807308197, + 0.05128839984536171, + 0.05257588252425194, + 0.05227001756429672, + 0.05196592956781387, + 0.05166361480951309, + 0.05233798548579216, + 0.05307700112462044, + 0.053826458752155304, + 0.05508929863572121, + 0.05649731308221817, + 0.057941313832998276, + 0.0581338107585907, + 0.057701535522937775, + 0.057272471487522125, + 0.05667392536997795, + 0.05591493099927902, + 0.0551660992205143, + 0.05438905954360962, + 0.05354394018650055, + 0.05271194875240326, + 0.05183366686105728, + 0.050552792847156525, + 0.0493035688996315, + 0.04808521270751953, + 0.04707583785057068, + 0.046106450259685516, + 0.04515702649950981, + 0.044127609580755234, + 0.04307303950190544, + 0.042043671011924744, + 0.040842559188604355, + 0.039404306560754776, + 0.038016702979803085, + 0.03665771707892418, + 0.03522542119026184, + 0.033849086612463, + 0.03252652660012245, + 0.031182391569018364, + 0.029881024733185768, + 0.02863396890461445, + 0.02803703024983406, + 0.02797110378742218, + 0.027905333787202835, + 0.027623122557997704, + 0.026534026488661766, + 0.012385672889649868, + 0.012922943569719791, + 0.013483518734574318, + 0.013869574293494225, + 0.014149331487715244, + 0.014434730634093285, + 0.014820021577179432, + 0.015226834453642368, + 0.015649182721972466, + 0.016109921038150787, + 0.016584226861596107, + 0.016954628750681877, + 0.017135564237833023, + 0.017318429425358772, + 0.017643537372350693, + 0.018073391169309616, + 0.018513714894652367, + 0.01887892559170723, + 0.019228748977184296, + 0.019585054367780685, + 0.020615145564079285, + 0.021714210510253906, + 0.022784026339650154, + 0.023387474939227104, + 0.024006906896829605, + 0.024396277964115143, + 0.024224424734711647, + 0.024053780362010002, + 0.024364087730646133, + 0.02531062252819538, + 0.026293927803635597, + 0.026970094069838524, + 0.02739005908370018, + 0.027816561982035637, + 0.028245093300938606, + 0.028677882626652718, + 0.02911730296909809, + 0.029674196615815163, + 0.03027839958667755, + 0.03089490719139576, + 0.03193126991391182, + 0.033090740442276, + 0.0342923142015934, + 0.03467560559511185, + 0.03494986519217491, + 0.035226304084062576, + 0.03612786531448364, + 0.03710651770234108, + 0.03811168298125267, + 0.039058856666088104, + 0.040024518966674805, + 0.04101405665278435, + 0.04119393229484558, + 0.041331931948661804, + 0.041470397263765335, + 0.042295075953006744, + 0.04318121075630188, + 0.044085919857025146, + 0.04437989369034767, + 0.044615041464567184, + 0.044851433485746384, + 0.045764051377773285, + 0.04680204018950462, + 0.04786356911063194, + 0.04898013174533844, + 0.050130441784858704, + 0.05130776762962341, + 0.052092619240283966, + 0.052728455513715744, + 0.05337205156683922, + 0.05299587547779083, + 0.05202685296535492, + 0.05107554793357849, + 0.051045890897512436, + 0.051887523382902145, + 0.052743036299943924, + 0.05313911288976669, + 0.052773747593164444, + 0.052410900592803955, + 0.05205140635371208, + 0.05169720947742462, + 0.051345426589250565, + 0.05101046338677406, + 0.0508858747780323, + 0.050761591643095016, + 0.050637610256671906, + 0.049564287066459656, + 0.0483875498175621, + 0.047238752245903015, + 0.04649697244167328, + 0.04594699665904045, + 0.04540352150797844, + 0.04499528557062149, + 0.04474417865276337, + 0.04449447616934776, + 0.04402953386306763, + 0.04279777780175209, + 0.041600484400987625, + 0.04043668136000633, + 0.039821986109018326, + 0.03923918679356575, + 0.03866491839289665, + 0.03795846551656723, + 0.037200678139925, + 0.03645801916718483, + 0.035648468881845474, + 0.03473087400197983, + 0.03383689746260643, + 0.03297869488596916, + 0.032297853380441666, + 0.03163106366991997, + 0.030978042632341385, + 0.029768452048301697, + 0.012936231680214405, + 0.01313075888901949, + 0.01330870296806097, + 0.013562834821641445, + 0.014137286692857742, + 0.014736068435013294, + 0.015080012381076813, + 0.015096131712198257, + 0.015112265944480896, + 0.015569526702165604, + 0.016238495707511902, + 0.016936207190155983, + 0.017323417589068413, + 0.017693888396024704, + 0.018105631694197655, + 0.018729226663708687, + 0.019374297931790352, + 0.019825272262096405, + 0.01987076923251152, + 0.01991637423634529, + 0.020273445174098015, + 0.020926164463162422, + 0.021599898114800453, + 0.02249510958790779, + 0.023520011454820633, + 0.024591607972979546, + 0.025172309949994087, + 0.025666160508990288, + 0.026169700548052788, + 0.02704128809273243, + 0.027949800714850426, + 0.0288234930485487, + 0.029110895469784737, + 0.02940116822719574, + 0.029886962845921516, + 0.031174834817647934, + 0.03251820430159569, + 0.03353841230273247, + 0.03363111615180969, + 0.03372407332062721, + 0.034398239105939865, + 0.03618251904845238, + 0.03805935010313988, + 0.03927083685994148, + 0.039412323385477066, + 0.03955432400107384, + 0.04019206762313843, + 0.04147389903664589, + 0.04279660806059837, + 0.044259119778871536, + 0.04588761553168297, + 0.04757603257894516, + 0.048678409308195114, + 0.049065858125686646, + 0.0494563952088356, + 0.049492765218019485, + 0.049104511737823486, + 0.04871930181980133, + 0.04897581785917282, + 0.05011836439371109, + 0.051287561655044556, + 0.0524006150662899, + 0.05339694023132324, + 0.05441221594810486, + 0.054869141429662704, + 0.054063137620687485, + 0.05326897278428078, + 0.0525079146027565, + 0.05182895064353943, + 0.05115876719355583, + 0.050587933510541916, + 0.050631746649742126, + 0.05067560076713562, + 0.050726693123579025, + 0.0513729564845562, + 0.05202745273709297, + 0.0526902861893177, + 0.05144481733441353, + 0.049972373992204666, + 0.0485420748591423, + 0.048422861844301224, + 0.04879387095570564, + 0.04916771873831749, + 0.04858214408159256, + 0.04725326597690582, + 0.045960742980241776, + 0.04478912055492401, + 0.04379184916615486, + 0.042816776782274246, + 0.041905056685209274, + 0.041226744651794434, + 0.04055940732359886, + 0.03990287706255913, + 0.03885505348443985, + 0.03780822455883026, + 0.03678959980607033, + 0.03623697906732559, + 0.03588490188121796, + 0.03553624451160431, + 0.03485995903611183, + 0.03377646952867508, + 0.03272665664553642, + 0.031727757304906845, + 0.030856646597385406, + 0.030009454116225243, + 0.029185520485043526, + 0.029305877164006233, + 0.029584215953946114, + 0.02986520156264305, + 0.029174696654081345, + 0.02771623060107231, + 0.026330674067139626, + 0.02525351569056511, + 0.012706668116152287, + 0.013107091188430786, + 0.013571017421782017, + 0.014051363803446293, + 0.014589355327188969, + 0.015157608315348625, + 0.015705861151218414, + 0.01572718285024166, + 0.015748532488942146, + 0.015943896025419235, + 0.016529681161046028, + 0.017136991024017334, + 0.017569400370121002, + 0.01784476451575756, + 0.018124442547559738, + 0.01862102933228016, + 0.019202305004000664, + 0.019801726564764977, + 0.02021900564432144, + 0.020634829998016357, + 0.021139442920684814, + 0.02220112830400467, + 0.02331613376736641, + 0.024420898407697678, + 0.02541486546397209, + 0.026449289172887802, + 0.0272742360830307, + 0.02780616469681263, + 0.028348464518785477, + 0.028920629993081093, + 0.029518669471144676, + 0.03012908063828945, + 0.030693314969539642, + 0.031241891905665398, + 0.031800273805856705, + 0.03325418755412102, + 0.035016827285289764, + 0.036872897297143936, + 0.037598077207803726, + 0.0381685234606266, + 0.038747627288103104, + 0.03961560130119324, + 0.040519196540117264, + 0.04144340381026268, + 0.04347798228263855, + 0.04561521112918854, + 0.04778174310922623, + 0.047695476561784744, + 0.0476093664765358, + 0.04758564010262489, + 0.0487758070230484, + 0.04999574273824692, + 0.05118810012936592, + 0.051293473690748215, + 0.05139906704425812, + 0.05151151865720749, + 0.051814232021570206, + 0.05211872607469559, + 0.05242575332522392, + 0.053799521178007126, + 0.055209286510944366, + 0.056655991822481155, + 0.0564088448882103, + 0.05607428029179573, + 0.055741701275110245, + 0.05609627813100815, + 0.05654513090848923, + 0.05699758231639862, + 0.056574150919914246, + 0.05593525990843773, + 0.05530359223484993, + 0.05389413237571716, + 0.05218998342752457, + 0.05053971707820892, + 0.050076987594366074, + 0.050462011247873306, + 0.05084999278187752, + 0.05050000920891762, + 0.049227990210056305, + 0.04798801243305206, + 0.04718318209052086, + 0.04740734025835991, + 0.04763256758451462, + 0.04752379655838013, + 0.044833242893218994, + 0.04229501262307167, + 0.039900485426187515, + 0.03902802988886833, + 0.03829345852136612, + 0.0375727079808712, + 0.036824461072683334, + 0.03607486933469772, + 0.03534053638577461, + 0.0343119353055954, + 0.03299815207719803, + 0.03173467516899109, + 0.03056458942592144, + 0.02957482822239399, + 0.028617117553949356, + 0.02769041806459427, + 0.027216579765081406, + 0.026760460808873177, + 0.026311980560421944, + 0.025825710967183113, + 0.025329027324914932, + 0.024841897189617157, + 0.02428525499999523, + 0.023623939603567123, + 0.02298063412308693, + 0.022337008267641068, + 0.021505504846572876, + 0.020704954862594604, + 0.01993420533835888, + 0.01158029492944479, + 0.011840925551950932, + 0.012148882262408733, + 0.012464849278330803, + 0.012917401269078255, + 0.013525632210075855, + 0.014162504114210606, + 0.014550434425473213, + 0.014853687956929207, + 0.015163262374699116, + 0.015647796913981438, + 0.016149671748280525, + 0.016568858176469803, + 0.016634752973914146, + 0.01670091040432453, + 0.017079297453165054, + 0.017906224355101585, + 0.018773186951875687, + 0.019725311547517776, + 0.020753569900989532, + 0.02183542773127556, + 0.022769872099161148, + 0.02369108609855175, + 0.024649571627378464, + 0.025103753432631493, + 0.025544483214616776, + 0.026024729013442993, + 0.02678159810602665, + 0.02756047621369362, + 0.02833556942641735, + 0.02904617041349411, + 0.029774591326713562, + 0.030674127861857414, + 0.03189058229327202, + 0.033155277371406555, + 0.03441713750362396, + 0.03566044196486473, + 0.036948658525943756, + 0.03823338821530342, + 0.03951764479279518, + 0.04084504395723343, + 0.041822731494903564, + 0.04255608841776848, + 0.04330230504274368, + 0.04453662037849426, + 0.046073298901319504, + 0.04766300320625305, + 0.0491463728249073, + 0.05059809237718582, + 0.052092693746089935, + 0.053474728018045425, + 0.05482335761189461, + 0.05620599910616875, + 0.05803234502673149, + 0.06010434404015541, + 0.06225031986832619, + 0.06312885135412216, + 0.06337863206863403, + 0.06362941116094589, + 0.06387601792812347, + 0.06412069499492645, + 0.06436631083488464, + 0.06453961879014969, + 0.06466224789619446, + 0.06478510051965714, + 0.06506632268428802, + 0.06549590826034546, + 0.06592832505702972, + 0.06512004882097244, + 0.0627470463514328, + 0.060460519045591354, + 0.05858317390084267, + 0.05741465836763382, + 0.05626944452524185, + 0.055028971284627914, + 0.05337533354759216, + 0.0517713837325573, + 0.0501469150185585, + 0.0476641021668911, + 0.04530421271920204, + 0.04306117072701454, + 0.04229887202382088, + 0.041684627532958984, + 0.04107930138707161, + 0.039181556552648544, + 0.036935508251190186, + 0.03481821343302727, + 0.03321921080350876, + 0.03201586380600929, + 0.03085610456764698, + 0.02980445884168148, + 0.028917398303747177, + 0.028056740760803223, + 0.027213942259550095, + 0.026331353932619095, + 0.025477387011051178, + 0.024651115760207176, + 0.0237098541110754, + 0.022781750187277794, + 0.021889977157115936, + 0.02122928574681282, + 0.02072116918861866, + 0.02022521384060383, + 0.019707191735506058, + 0.01912812516093254, + 0.01856607384979725, + 0.01802157051861286, + 0.017687363550066948, + 0.017359353601932526, + 0.01703742705285549, + 0.01668066345155239, + 0.016312969848513603, + 0.01595338061451912, + 0.010264456272125244, + 0.01076868362724781, + 0.010851210914552212, + 0.010913961566984653, + 0.011120135895907879, + 0.011842438019812107, + 0.012611658312380314, + 0.013156482949852943, + 0.01342370081692934, + 0.013696346431970596, + 0.013943984173238277, + 0.014184136874973774, + 0.014428425580263138, + 0.014660745859146118, + 0.01489587314426899, + 0.0152267562225461, + 0.016087748110294342, + 0.01699742302298546, + 0.017737803980708122, + 0.018086465075612068, + 0.018441978842020035, + 0.019017450511455536, + 0.019811591133475304, + 0.02063889615237713, + 0.021447161212563515, + 0.022261684760451317, + 0.023107143118977547, + 0.02402488887310028, + 0.02498754672706127, + 0.025988778099417686, + 0.02660733461380005, + 0.02722313068807125, + 0.027935266494750977, + 0.029744518920779228, + 0.0316709540784359, + 0.033623356372117996, + 0.035190194845199585, + 0.03683004528284073, + 0.0385107658803463, + 0.04015737771987915, + 0.041874393820762634, + 0.04316273331642151, + 0.04338430240750313, + 0.04360701143741608, + 0.044791772961616516, + 0.04780067875981331, + 0.05101171135902405, + 0.05385363847017288, + 0.0559120774269104, + 0.05804920196533203, + 0.05963856354355812, + 0.06033989042043686, + 0.061049461364746094, + 0.06229129806160927, + 0.0643562451004982, + 0.06648963689804077, + 0.06884506344795227, + 0.07153607904911041, + 0.07433228194713593, + 0.07619968801736832, + 0.07615039497613907, + 0.07610113173723221, + 0.07620510458946228, + 0.0766804963350296, + 0.0771588534116745, + 0.07731729745864868, + 0.07635219395160675, + 0.07539913803339005, + 0.0744120329618454, + 0.07314398884773254, + 0.07189755886793137, + 0.07060740143060684, + 0.06712076812982559, + 0.06380631029605865, + 0.06065552309155464, + 0.05762480944395065, + 0.054741956293582916, + 0.052003324031829834, + 0.04833383113145828, + 0.04461941868066788, + 0.041190456598997116, + 0.03880417346954346, + 0.03704490512609482, + 0.03536539897322655, + 0.0334668904542923, + 0.03130045905709267, + 0.029274271801114082, + 0.02754884958267212, + 0.026456600055098534, + 0.025407657027244568, + 0.024388020858168602, + 0.022860947996377945, + 0.02142949216067791, + 0.020087670534849167, + 0.01963452808558941, + 0.019405994564294815, + 0.019180122762918472, + 0.018401026725769043, + 0.01721418835222721, + 0.016103899106383324, + 0.015209639444947243, + 0.014732139185070992, + 0.014269628562033176, + 0.013821638189256191, + 0.013393731787800789, + 0.01297913957387209, + 0.012577380053699017, + 0.012194053269922733, + 0.011825084686279297, + 0.011467281728982925, + 0.011118789203464985, + 0.010778296738862991, + 0.010448231361806393, + 0.007931067608296871, + 0.008122079074382782, + 0.0082723842933774, + 0.00841020792722702, + 0.008555415086448193, + 0.008955257944762707, + 0.009373788721859455, + 0.009817334823310375, + 0.010296972468495369, + 0.010800043120980263, + 0.01125518511980772, + 0.011658349074423313, + 0.012075955979526043, + 0.012410867027938366, + 0.012719377875328064, + 0.013035557232797146, + 0.013436399400234222, + 0.013854261487722397, + 0.014311734586954117, + 0.01496017724275589, + 0.015638001263141632, + 0.01637299917638302, + 0.017203811556100845, + 0.018076783046126366, + 0.018830178305506706, + 0.019425781443715096, + 0.020040225237607956, + 0.02094367891550064, + 0.022065265104174614, + 0.023246917873620987, + 0.024385906755924225, + 0.02554258331656456, + 0.026754120364785194, + 0.02809694968163967, + 0.02952026203274727, + 0.031015677377581596, + 0.032297514379024506, + 0.03361696004867554, + 0.035002004355192184, + 0.03683580830693245, + 0.03876568377017975, + 0.04078596085309982, + 0.04280177876353264, + 0.04491722211241722, + 0.04700638726353645, + 0.04835357517004013, + 0.049739375710487366, + 0.051390908658504486, + 0.054265305399894714, + 0.05730047449469566, + 0.06045785918831825, + 0.06356289982795715, + 0.06682741641998291, + 0.07054051011800766, + 0.07585485279560089, + 0.08156955987215042, + 0.08686216175556183, + 0.08773123472929001, + 0.0886090099811554, + 0.08953860402107239, + 0.09080452471971512, + 0.09208835661411285, + 0.0933322012424469, + 0.09371277689933777, + 0.0940949097275734, + 0.09447859972715378, + 0.09177017956972122, + 0.08910949528217316, + 0.08652595430612564, + 0.08297742158174515, + 0.07946456968784332, + 0.0761004313826561, + 0.07154637575149536, + 0.0669415220618248, + 0.06263304501771927, + 0.05869792774319649, + 0.055054813623428345, + 0.051637813448905945, + 0.04722457379102707, + 0.04221564903855324, + 0.037738002836704254, + 0.03423602133989334, + 0.03186279162764549, + 0.029654070734977722, + 0.027544787153601646, + 0.025371128693223, + 0.02336900122463703, + 0.021524867042899132, + 0.020093899220228195, + 0.0187600739300251, + 0.0175147857517004, + 0.01654694974422455, + 0.015685448423027992, + 0.014868798665702343, + 0.014135649427771568, + 0.013471100479364395, + 0.012837793678045273, + 0.012257635593414307, + 0.011756927706301212, + 0.011276672594249249, + 0.010816688649356365, + 0.010397556237876415, + 0.009994665160775185, + 0.009607384912669659, + 0.009288422763347626, + 0.008998162113130093, + 0.008716972544789314, + 0.008420325815677643, + 0.008103492669761181, + 0.007798581849783659, + 0.007538097910583019, + 0.007546029053628445, + 0.007553968578577042, + 0.005524537991732359, + 0.005903657991439104, + 0.00619449932128191, + 0.006422289647161961, + 0.00665845675393939, + 0.00682421401143074, + 0.00698238518089056, + 0.007147361058741808, + 0.0073384675197303295, + 0.007534684147685766, + 0.00772891566157341, + 0.00791523139923811, + 0.00810603890568018, + 0.008461630903184414, + 0.008952517062425613, + 0.00947188213467598, + 0.010045947507023811, + 0.010661599226295948, + 0.011314980685710907, + 0.011690567247569561, + 0.012073499150574207, + 0.012475920841097832, + 0.012929626740515232, + 0.01339983195066452, + 0.014020463451743126, + 0.014972520060837269, + 0.015989229083061218, + 0.01693044602870941, + 0.017750442028045654, + 0.0186101533472538, + 0.019906463101506233, + 0.0215928815305233, + 0.02342217043042183, + 0.024499543011188507, + 0.025230130180716515, + 0.025982504710555077, + 0.027197401970624924, + 0.028589515015482903, + 0.030052881687879562, + 0.03185803443193436, + 0.03381309658288956, + 0.03588813543319702, + 0.038032107055187225, + 0.04029981791973114, + 0.042702749371528625, + 0.046001892536878586, + 0.04957292973995209, + 0.05340948700904846, + 0.05602005869150162, + 0.05875823646783829, + 0.061663106083869934, + 0.06643517315387726, + 0.0715765431523323, + 0.07711576670408249, + 0.0830819308757782, + 0.08950966596603394, + 0.09643469750881195, + 0.10097392648458481, + 0.10570486634969711, + 0.1106574758887291, + 0.1141505315899849, + 0.11766979843378067, + 0.12129756808280945, + 0.12064524739980698, + 0.11950760334730148, + 0.11838069558143616, + 0.112465038895607, + 0.10589643567800522, + 0.09971148520708084, + 0.09398581832647324, + 0.0886225700378418, + 0.0835653692483902, + 0.0765567198395729, + 0.06893376260995865, + 0.0620698407292366, + 0.055853113532066345, + 0.050226353108882904, + 0.04516644775867462, + 0.040697284042835236, + 0.03680263087153435, + 0.03328068554401398, + 0.029959088191390038, + 0.026467470452189445, + 0.02338278666138649, + 0.020672382786870003, + 0.019080625846982002, + 0.017611434683203697, + 0.016255371272563934, + 0.015010382048785686, + 0.01386210322380066, + 0.012801664881408215, + 0.011969692073762417, + 0.011282769963145256, + 0.010635270737111568, + 0.009989035315811634, + 0.009325375780463219, + 0.008705809712409973, + 0.008141973987221718, + 0.007714684121310711, + 0.007309817709028721, + 0.006926199421286583, + 0.006666920147836208, + 0.006435046438127756, + 0.006211236119270325, + 0.005971674807369709, + 0.005723870825022459, + 0.005486350040882826, + 0.005289566703140736, + 0.005186967086046934, + 0.005086357239633799, + 0.00498769897967577, + 0.004802985582500696, + 0.004618969280272722, + 0.006612553261220455, + 0.006782259792089462, + 0.007098272908478975, + 0.007570994086563587, + 0.008075197227299213, + 0.008347894065082073, + 0.008556022308766842, + 0.008775551803410053, + 0.00916595384478569, + 0.009573724120855331, + 0.009947715327143669, + 0.010195370763540268, + 0.010449190624058247, + 0.010918824933469296, + 0.011635699309408665, + 0.012399639002978802, + 0.012988083064556122, + 0.013505794107913971, + 0.01404414139688015, + 0.014671344310045242, + 0.015334979631006718, + 0.016027888283133507, + 0.016741452738642693, + 0.017486784607172012, + 0.01825677789747715, + 0.019030362367630005, + 0.019836723804473877, + 0.020764905959367752, + 0.021894078701734543, + 0.023084653541445732, + 0.024324681609869003, + 0.025614958256483078, + 0.026973679661750793, + 0.028069788590073586, + 0.028986450284719467, + 0.02993304654955864, + 0.03132370486855507, + 0.03296573460102081, + 0.03469384089112282, + 0.03673408553004265, + 0.0389615036547184, + 0.04132398962974548, + 0.04365144670009613, + 0.046073999255895615, + 0.04863100126385689, + 0.0507112555205822, + 0.05279633775353432, + 0.05496715009212494, + 0.057065319269895554, + 0.059227339923381805, + 0.06147127225995064, + 0.06545910239219666, + 0.06985494494438171, + 0.0745459794998169, + 0.07992886006832123, + 0.08573687821626663, + 0.09196694195270538, + 0.09629388153553009, + 0.1005384549498558, + 0.10497013479471207, + 0.10485507547855377, + 0.10395892709493637, + 0.10307042300701141, + 0.10314109921455383, + 0.10345347970724106, + 0.10376681387424469, + 0.10125649720430374, + 0.0977788195014, + 0.09442058205604553, + 0.08790481835603714, + 0.08012416958808899, + 0.0730321928858757, + 0.0673130601644516, + 0.06267102062702179, + 0.05834910273551941, + 0.05390158295631409, + 0.04920745640993118, + 0.0449221208691597, + 0.040791258215904236, + 0.03646410256624222, + 0.03259597346186638, + 0.02923479862511158, + 0.027083082124590874, + 0.02508973516523838, + 0.023243101313710213, + 0.021459054201841354, + 0.019805531948804855, + 0.01827942207455635, + 0.016756925731897354, + 0.015319984406232834, + 0.014006264507770538, + 0.013070213608443737, + 0.012448578141629696, + 0.011856506578624249, + 0.011286264285445213, + 0.010726923123002052, + 0.010195301845669746, + 0.009687517769634724, + 0.009052869863808155, + 0.008459798991680145, + 0.00790558010339737, + 0.007500472944229841, + 0.007153078448027372, + 0.006821773946285248, + 0.006571578793227673, + 0.006406740751117468, + 0.006246037315577269, + 0.006081131286919117, + 0.005875264760106802, + 0.005676367320120335, + 0.005484203342348337, + 0.005354842636734247, + 0.0052403477020561695, + 0.012001775205135345, + 0.012341373600065708, + 0.01281775999814272, + 0.01345317903906107, + 0.014120098203420639, + 0.015035451389849186, + 0.016085268929600716, + 0.017196422442793846, + 0.016826381906867027, + 0.01646430231630802, + 0.016379229724407196, + 0.017148083075881004, + 0.01795302703976631, + 0.018694397062063217, + 0.01934649609029293, + 0.020021339878439903, + 0.02111855149269104, + 0.02248341403901577, + 0.02393648773431778, + 0.024866031482815742, + 0.025731351226568222, + 0.0266591664403677, + 0.028495898470282555, + 0.030459174886345863, + 0.03220050781965256, + 0.032535143196582794, + 0.032873254269361496, + 0.03330652043223381, + 0.03392768278717995, + 0.034560427069664, + 0.03549113869667053, + 0.036788105964660645, + 0.03813247010111809, + 0.039097096771001816, + 0.03976425901055336, + 0.040442805737257004, + 0.04168517515063286, + 0.043250247836112976, + 0.044874079525470734, + 0.04708469286561012, + 0.049593038856983185, + 0.05223502218723297, + 0.053082175552845, + 0.053484417498111725, + 0.05388971418142319, + 0.05777556821703911, + 0.06261333078145981, + 0.06785617023706436, + 0.06683257967233658, + 0.06496948003768921, + 0.063158318400383, + 0.0637548640370369, + 0.06465504318475723, + 0.06556794047355652, + 0.06757878512144089, + 0.06979801505804062, + 0.07209012657403946, + 0.07218518108129501, + 0.07192320376634598, + 0.07166218757629395, + 0.07103841751813889, + 0.07034246623516083, + 0.06965332478284836, + 0.068694569170475, + 0.06766572594642639, + 0.06665229797363281, + 0.06519242376089096, + 0.06356398016214371, + 0.06197620928287506, + 0.059733450412750244, + 0.057129498571157455, + 0.0546390637755394, + 0.05219622701406479, + 0.04980228468775749, + 0.04751813784241676, + 0.04547671228647232, + 0.043754179030656815, + 0.04209688678383827, + 0.040238410234451294, + 0.037582606077194214, + 0.03510208800435066, + 0.03275999054312706, + 0.0301973894238472, + 0.027835246175527573, + 0.02565787546336651, + 0.024607686325907707, + 0.023729706183075905, + 0.02288305200636387, + 0.021604793146252632, + 0.020197255536913872, + 0.0188814178109169, + 0.01782890036702156, + 0.01702943444252014, + 0.01626581884920597, + 0.015507255680859089, + 0.014692386612296104, + 0.013920336961746216, + 0.013188855722546577, + 0.012881417758762836, + 0.01258887629956007, + 0.012302977964282036, + 0.01178674679249525, + 0.011200767010450363, + 0.010643919929862022, + 0.010195770300924778, + 0.009874126873910427, + 0.009562631137669086, + 0.00926413293927908, + 0.008998865261673927, + 0.008741192519664764, + 0.00849089864641428, + 0.008259753696620464, + 0.008038037456572056, + 0.014004761353135109, + 0.014881065115332603, + 0.015556070022284985, + 0.016014697030186653, + 0.016486845910549164, + 0.01739579625427723, + 0.01847934164106846, + 0.01958894170820713, + 0.01966799981892109, + 0.019747378304600716, + 0.02005898952484131, + 0.021010154858231544, + 0.02200642228126526, + 0.023078678175807, + 0.02423376403748989, + 0.025446662679314613, + 0.02617216669023037, + 0.02668364718556404, + 0.027205118909478188, + 0.028426002711057663, + 0.02978876791894436, + 0.031169354915618896, + 0.031940292567014694, + 0.03273029997944832, + 0.03385089337825775, + 0.0361298993229866, + 0.038562338799238205, + 0.04023349657654762, + 0.040379155427217484, + 0.040525343269109726, + 0.04133366420865059, + 0.04285518452525139, + 0.04443271458148956, + 0.04518648236989975, + 0.04537983238697052, + 0.04557401314377785, + 0.04681716114282608, + 0.04856247082352638, + 0.05037285014986992, + 0.05189528688788414, + 0.053359705954790115, + 0.05486544594168663, + 0.05541800707578659, + 0.05578551068902016, + 0.05615545064210892, + 0.05743122845888138, + 0.058858439326286316, + 0.06032111868262291, + 0.06173527613282204, + 0.06317419558763504, + 0.0646466463804245, + 0.06359532475471497, + 0.06235576793551445, + 0.06114037334918976, + 0.06207232549786568, + 0.06321626901626587, + 0.06438129395246506, + 0.06324099749326706, + 0.06185772642493248, + 0.06050470843911171, + 0.0596625842154026, + 0.05891289561986923, + 0.05817262828350067, + 0.05786405876278877, + 0.05766363441944122, + 0.05746389925479889, + 0.056539662182331085, + 0.05536140128970146, + 0.0542076975107193, + 0.05261008068919182, + 0.05079833045601845, + 0.049048978835344315, + 0.047468602657318115, + 0.04603475704789162, + 0.04464421793818474, + 0.04269589111208916, + 0.039980821311473846, + 0.03743840381503105, + 0.035246748477220535, + 0.03371081128716469, + 0.032241806387901306, + 0.03082364611327648, + 0.02934500016272068, + 0.027937285602092743, + 0.026597103103995323, + 0.025378495454788208, + 0.024220917373895645, + 0.023116137832403183, + 0.022163063287734985, + 0.021287940442562103, + 0.020447371527552605, + 0.01956508867442608, + 0.018649637699127197, + 0.01777702011168003, + 0.016981184482574463, + 0.01631561852991581, + 0.015676140785217285, + 0.015062770806252956, + 0.01453810278326273, + 0.014031707309186459, + 0.013542952947318554, + 0.01302573923021555, + 0.012513358145952225, + 0.012021133676171303, + 0.011643039993941784, + 0.011386992409825325, + 0.011136574670672417, + 0.01087888516485691, + 0.010556553490459919, + 0.010243772529065609, + 0.009940259158611298, + 0.00970610324293375, + 0.009490097872912884, + 0.01514296606183052, + 0.01595786027610302, + 0.01684822142124176, + 0.01781015843153, + 0.01882701739668846, + 0.018913153558969498, + 0.0188593789935112, + 0.018905743956565857, + 0.019659291952848434, + 0.020442871376872063, + 0.021186236292123795, + 0.021828072145581245, + 0.02248934842646122, + 0.023678326979279518, + 0.025313617661595345, + 0.02706184983253479, + 0.028203168883919716, + 0.029198383912444115, + 0.030228719115257263, + 0.03176550194621086, + 0.03338828682899475, + 0.034921564161777496, + 0.03558987006545067, + 0.03627096116542816, + 0.03711291775107384, + 0.03829975053668022, + 0.03952454403042793, + 0.04055839031934738, + 0.04134590923786163, + 0.04214872047305107, + 0.04329248517751694, + 0.0447019524872303, + 0.04615730419754982, + 0.04711465910077095, + 0.04785509780049324, + 0.048607178032398224, + 0.050469789654016495, + 0.052703045308589935, + 0.05503511801362038, + 0.05620093271136284, + 0.05720469355583191, + 0.05822638049721718, + 0.05797211080789566, + 0.057629600167274475, + 0.057289108633995056, + 0.05805491656064987, + 0.05885444954037666, + 0.0596625916659832, + 0.0601838119328022, + 0.06070958450436592, + 0.06123941019177437, + 0.06174672394990921, + 0.06225823983550072, + 0.06277372688055038, + 0.06327533721923828, + 0.06378094851970673, + 0.0642906054854393, + 0.06269597262144089, + 0.06112617999315262, + 0.059595681726932526, + 0.058454081416130066, + 0.057351090013980865, + 0.05626891180872917, + 0.05599048733711243, + 0.055803120136260986, + 0.055616386234760284, + 0.05338224396109581, + 0.05082785710692406, + 0.048395704478025436, + 0.04620929807424545, + 0.04416666552424431, + 0.042214326560497284, + 0.040609270334243774, + 0.039216525852680206, + 0.03787154704332352, + 0.03671443462371826, + 0.035730890929698944, + 0.03477369248867035, + 0.03354211524128914, + 0.0318375863134861, + 0.030219677835702896, + 0.028745926916599274, + 0.02758835069835186, + 0.0264773890376091, + 0.02541179582476616, + 0.02442559227347374, + 0.02347766049206257, + 0.022566519677639008, + 0.02164912410080433, + 0.020760243758559227, + 0.019907858222723007, + 0.01918799616396427, + 0.018555868417024612, + 0.017944565042853355, + 0.017272816970944405, + 0.016495972871780396, + 0.01575406827032566, + 0.015095099806785583, + 0.014814620837569237, + 0.014539350755512714, + 0.014269196428358555, + 0.013754813000559807, + 0.013217411004006863, + 0.012701005674898624, + 0.012286028824746609, + 0.011945908889174461, + 0.011615205556154251, + 0.011327558197081089, + 0.01114325039088726, + 0.010961940512061119, + 0.01078358106315136, + 0.010451302863657475, + 0.010118219070136547, + 0.01626218855381012, + 0.01680179126560688, + 0.017107965424656868, + 0.01733558066189289, + 0.01758447103202343, + 0.018748629838228226, + 0.01998985931277275, + 0.021066075190901756, + 0.021526768803596497, + 0.02199753373861313, + 0.022661054506897926, + 0.023524107411503792, + 0.024420032277703285, + 0.025332771241664886, + 0.02627321146428585, + 0.02724856324493885, + 0.028362005949020386, + 0.029527222737669945, + 0.030707499012351036, + 0.03171904757618904, + 0.03276391327381134, + 0.034202948212623596, + 0.036547571420669556, + 0.03905291482806206, + 0.04029297083616257, + 0.039974410086870193, + 0.03965837135910988, + 0.039970263838768005, + 0.04068245366215706, + 0.04140733554959297, + 0.04293820261955261, + 0.04481211677193642, + 0.046767815947532654, + 0.04719142988324165, + 0.04734920710325241, + 0.04750751331448555, + 0.04921411722898483, + 0.051065605133771896, + 0.05294854938983917, + 0.05364953726530075, + 0.0543598011136055, + 0.05510648339986801, + 0.0561312697827816, + 0.057175107300281525, + 0.058319464325904846, + 0.06000138446688652, + 0.06173180416226387, + 0.06291135400533676, + 0.06117470562458038, + 0.05948600545525551, + 0.05829289183020592, + 0.05915584787726402, + 0.06003158167004585, + 0.060698941349983215, + 0.060343366116285324, + 0.05998987331986427, + 0.05956729128956795, + 0.058766428381204605, + 0.057976335287094116, + 0.057069312781095505, + 0.05524421110749245, + 0.05347748100757599, + 0.05178972706198692, + 0.050483159720897675, + 0.04920955002307892, + 0.047968074679374695, + 0.04701527953147888, + 0.046083975583314896, + 0.04517111927270889, + 0.044618867337703705, + 0.04411105066537857, + 0.04360901936888695, + 0.04172191768884659, + 0.039576128125190735, + 0.037540700286626816, + 0.03630833327770233, + 0.03545677661895752, + 0.03462518751621246, + 0.033426061272621155, + 0.031935181468725204, + 0.030510803684592247, + 0.02953498438000679, + 0.029248394072055817, + 0.028964586555957794, + 0.028431206941604614, + 0.02686171792447567, + 0.025378869846463203, + 0.02397788129746914, + 0.023459134623408318, + 0.022958017885684967, + 0.022467605769634247, + 0.021497167646884918, + 0.020436806604266167, + 0.01942874677479267, + 0.018783528357744217, + 0.018415099009871483, + 0.018053896725177765, + 0.017583806067705154, + 0.016860397532582283, + 0.016166748479008675, + 0.015508642420172691, + 0.015115819871425629, + 0.014732945710420609, + 0.014359770342707634, + 0.01423738431185484, + 0.014200774021446705, + 0.014164259657263756, + 0.01400536298751831, + 0.013692707754671574, + 0.013387033715844154, + 0.013073616661131382, + 0.012654392048716545, + 0.012248610146343708, + 0.016421452164649963, + 0.017595820128917694, + 0.018034541979432106, + 0.018446173518896103, + 0.01896451599895954, + 0.019842984154820442, + 0.020762145519256592, + 0.021663395687937737, + 0.02253611944615841, + 0.023444002494215965, + 0.024384714663028717, + 0.025361675769090652, + 0.02637777477502823, + 0.0265041496604681, + 0.0265789981931448, + 0.026808973401784897, + 0.027908917516469955, + 0.02905398979783058, + 0.030109001323580742, + 0.03093796782195568, + 0.03178975358605385, + 0.03266039863228798, + 0.03355061635375023, + 0.03446509316563606, + 0.03587249666452408, + 0.037562046200037, + 0.03933117166161537, + 0.040223293006420135, + 0.04093969613313675, + 0.0416688546538353, + 0.04293879121541977, + 0.04426972568035126, + 0.04557276517152786, + 0.0460299588739872, + 0.04649174585938454, + 0.04719853028655052, + 0.04912120848894119, + 0.05112220719456673, + 0.053023677319288254, + 0.054438818246126175, + 0.055891722440719604, + 0.05671153962612152, + 0.05608648061752319, + 0.05546830594539642, + 0.05536971241235733, + 0.056184809654951096, + 0.05701190605759621, + 0.057804081588983536, + 0.058533500880002975, + 0.059272125363349915, + 0.058973658829927444, + 0.05718991532921791, + 0.0554601289331913, + 0.054429516196250916, + 0.05436966195702553, + 0.054309871047735214, + 0.054069291800260544, + 0.05354207381606102, + 0.05301999673247337, + 0.05221565067768097, + 0.05089525878429413, + 0.0496082566678524, + 0.04843401536345482, + 0.047477006912231445, + 0.046538908034563065, + 0.04589055851101875, + 0.046201568096876144, + 0.046514686197042465, + 0.046530935913324356, + 0.04465024545788765, + 0.04284557327628136, + 0.04114712402224541, + 0.04066380485892296, + 0.04018615558743477, + 0.03971412032842636, + 0.03801962733268738, + 0.03627484664320946, + 0.03461013361811638, + 0.03354896232485771, + 0.03268067538738251, + 0.03183485567569733, + 0.031055143103003502, + 0.03032280132174492, + 0.029607728123664856, + 0.028917478397488594, + 0.028253726661205292, + 0.02760520577430725, + 0.02703145705163479, + 0.026663247495889664, + 0.02630005031824112, + 0.025925658643245697, + 0.02481842413544655, + 0.023758476600050926, + 0.022743795067071915, + 0.022053321823477745, + 0.021456696093082428, + 0.020876212045550346, + 0.020466292276978493, + 0.020193902775645256, + 0.019925137981772423, + 0.01956796646118164, + 0.01898030750453472, + 0.018410295248031616, + 0.017857400700449944, + 0.017421893775463104, + 0.01699812337756157, + 0.01658465899527073, + 0.016129305586218834, + 0.015663256868720055, + 0.01521067600697279, + 0.014916423708200455, + 0.014882204122841358, + 0.014848061837255955, + 0.01647302694618702, + 0.017068052664399147, + 0.017496293410658836, + 0.01793527975678444, + 0.018669389188289642, + 0.01974480040371418, + 0.02088215947151184, + 0.02119622565805912, + 0.021219395101070404, + 0.021242590621113777, + 0.022077517583966255, + 0.022954389452934265, + 0.02386743202805519, + 0.02482188679277897, + 0.02581450715661049, + 0.026690373197197914, + 0.02737916074693203, + 0.028085723519325256, + 0.029277848079800606, + 0.03082284703850746, + 0.032449375838041306, + 0.03376169130206108, + 0.0350230373442173, + 0.03633150830864906, + 0.0363662913441658, + 0.03634927421808243, + 0.0364188626408577, + 0.037209585309028625, + 0.03801747038960457, + 0.03903159871697426, + 0.040695201605558395, + 0.042429711669683456, + 0.04365415498614311, + 0.043836530297994614, + 0.0440196692943573, + 0.044769689440727234, + 0.04624046012759209, + 0.04775955528020859, + 0.04901238530874252, + 0.05001652240753174, + 0.05104123055934906, + 0.05201904848217964, + 0.05296941101551056, + 0.05393713340163231, + 0.05463894084095955, + 0.055194683372974396, + 0.05575607344508171, + 0.055509988218545914, + 0.054889045655727386, + 0.05427505820989609, + 0.05378890037536621, + 0.0533595085144043, + 0.05293354392051697, + 0.05350489541888237, + 0.054529543966054916, + 0.05557382106781006, + 0.05488879978656769, + 0.053405698388814926, + 0.05196266248822212, + 0.05048627778887749, + 0.049012597650289536, + 0.047581929713487625, + 0.04695504158735275, + 0.04686804488301277, + 0.046781208366155624, + 0.046088431030511856, + 0.04486091807484627, + 0.04366609454154968, + 0.04285496845841408, + 0.042515724897384644, + 0.0421791672706604, + 0.04176299646496773, + 0.04118500277400017, + 0.040615007281303406, + 0.039988670498132706, + 0.03913049399852753, + 0.038290735334157944, + 0.03744165971875191, + 0.03624454513192177, + 0.03508570045232773, + 0.03396390751004219, + 0.03380333632230759, + 0.03373537212610245, + 0.03366754204034805, + 0.03292936831712723, + 0.03197504207491875, + 0.031048377975821495, + 0.030088074505329132, + 0.029108239337801933, + 0.02816031128168106, + 0.02727014757692814, + 0.026460543274879456, + 0.02567497454583645, + 0.02495610900223255, + 0.02462594211101532, + 0.024300143122673035, + 0.02397865615785122, + 0.023685527965426445, + 0.02339997887611389, + 0.02311786822974682, + 0.022822977975010872, + 0.022520801052451134, + 0.022222625091671944, + 0.021846076473593712, + 0.02129467763006687, + 0.020757196471095085, + 0.020232122391462326, + 0.019504113122820854, + 0.018802300095558167, + 0.018125738948583603, + 0.017633212730288506, + 0.01722622662782669, + 0.016828635707497597, + 0.015763400122523308, + 0.016250258311629295, + 0.01669229380786419, + 0.017146354541182518, + 0.017672687768936157, + 0.018229324370622635, + 0.01881992444396019, + 0.019647367298603058, + 0.020511189475655556, + 0.021194785833358765, + 0.021420883014798164, + 0.02164939045906067, + 0.02215716987848282, + 0.022917402908205986, + 0.023703722283244133, + 0.024677343666553497, + 0.025745121762156487, + 0.026859100908041, + 0.027392152696847916, + 0.027903951704502106, + 0.028500737622380257, + 0.02961859479546547, + 0.030780300498008728, + 0.03178063780069351, + 0.032314274460077286, + 0.03285687416791916, + 0.03395549952983856, + 0.03580540418624878, + 0.03775608539581299, + 0.03888843581080437, + 0.03937564045190811, + 0.039868950843811035, + 0.040664393454790115, + 0.041608747094869614, + 0.04257502406835556, + 0.04348655790090561, + 0.04439735785126686, + 0.04532722383737564, + 0.04623919725418091, + 0.04716428741812706, + 0.04810788482427597, + 0.048900771886110306, + 0.049697041511535645, + 0.05050627887248993, + 0.05097419023513794, + 0.051445573568344116, + 0.051951538771390915, + 0.053399424999952316, + 0.05488766357302666, + 0.05623488873243332, + 0.05413023754954338, + 0.05210435763001442, + 0.05024627223610878, + 0.0501679964363575, + 0.05008983984589577, + 0.05000683292746544, + 0.049782488495111465, + 0.049559157341718674, + 0.04933641105890274, + 0.04853019118309021, + 0.04773715138435364, + 0.046957068145275116, + 0.04685281962156296, + 0.046783555299043655, + 0.04671439900994301, + 0.045677777379751205, + 0.044540245085954666, + 0.04343104735016823, + 0.043202128261327744, + 0.04319155588746071, + 0.04318099096417427, + 0.04272010177373886, + 0.042071010917425156, + 0.04143178090453148, + 0.04115011915564537, + 0.04112620651721954, + 0.04110230877995491, + 0.04076164960861206, + 0.04002608358860016, + 0.03930378705263138, + 0.03843694180250168, + 0.03720386326313019, + 0.036010339856147766, + 0.03495779633522034, + 0.03474106267094612, + 0.03452567383646965, + 0.03431161865592003, + 0.03388373181223869, + 0.033442988991737366, + 0.03300798311829567, + 0.03238172084093094, + 0.03168962895870209, + 0.031012332066893578, + 0.030503766611218452, + 0.03016512095928192, + 0.029830235987901688, + 0.029314352199435234, + 0.02824224904179573, + 0.027209356427192688, + 0.026214241981506348, + 0.02574450708925724, + 0.025294309481978416, + 0.02485198900103569, + 0.024190224707126617, + 0.023450156673789024, + 0.022732730954885483, + 0.022166509181261063, + 0.021808063611388206, + 0.021455414593219757, + 0.021098462864756584, + 0.02063034102320671, + 0.02017260529100895, + 0.019725024700164795, + 0.014587411656975746, + 0.014846749603748322, + 0.015047715976834297, + 0.015279663726687431, + 0.01563446782529354, + 0.0159975104033947, + 0.01657652109861374, + 0.017437096685171127, + 0.01834234781563282, + 0.018744414672255516, + 0.018920358270406723, + 0.019097954034805298, + 0.020207485184073448, + 0.021456444635987282, + 0.02256849780678749, + 0.02245420590043068, + 0.02234049141407013, + 0.022754840552806854, + 0.024238266050815582, + 0.025818396359682083, + 0.026715092360973358, + 0.026931023225188255, + 0.027148699387907982, + 0.02811994031071663, + 0.029477018862962723, + 0.030899588018655777, + 0.031289275735616684, + 0.03148244693875313, + 0.03167681023478508, + 0.03312593698501587, + 0.03466968238353729, + 0.0361359603703022, + 0.036259643733501434, + 0.036383748054504395, + 0.03664252907037735, + 0.03744761645793915, + 0.03827039152383804, + 0.03923727944493294, + 0.040552180260419846, + 0.04191114380955696, + 0.043144501745700836, + 0.04409756138920784, + 0.04507167637348175, + 0.045584049075841904, + 0.04540644958615303, + 0.04522953927516937, + 0.04541652277112007, + 0.04606138914823532, + 0.04671541228890419, + 0.04691914841532707, + 0.04660011827945709, + 0.046283259987831116, + 0.04617030546069145, + 0.04628659784793854, + 0.0464031808078289, + 0.04674232751131058, + 0.04735337942838669, + 0.047972422093153, + 0.04840604588389397, + 0.048579927533864975, + 0.048754431307315826, + 0.04895121976733208, + 0.04918484762310982, + 0.0494195930659771, + 0.04939725995063782, + 0.04880890995264053, + 0.04822757840156555, + 0.04772179573774338, + 0.04745068401098251, + 0.047181110829114914, + 0.04689641669392586, + 0.046502068638801575, + 0.04611104354262352, + 0.04572959244251251, + 0.04586632177233696, + 0.04600345715880394, + 0.04614100605249405, + 0.045175950974226, + 0.04408206045627594, + 0.043014656752347946, + 0.042409539222717285, + 0.041977476328611374, + 0.04154980927705765, + 0.04118912294507027, + 0.04088149219751358, + 0.040576156228780746, + 0.04007799178361893, + 0.03925501927733421, + 0.03844894841313362, + 0.03773212060332298, + 0.03740439936518669, + 0.037079520523548126, + 0.036757469177246094, + 0.035733338445425034, + 0.034691546112298965, + 0.03368012607097626, + 0.033359941095113754, + 0.03333614394068718, + 0.0333123654127121, + 0.033011432737112045, + 0.03235745057463646, + 0.031716421246528625, + 0.030927425250411034, + 0.029313748702406883, + 0.02778427116572857, + 0.026334593072533607, + 0.025512000545859337, + 0.024805476889014244, + 0.024118522182106972, + 0.023538392037153244, + 0.02304523065686226, + 0.02256239950656891, + 0.02204631268978119, + 0.010935329832136631, + 0.01126188039779663, + 0.011598183773458004, + 0.012081272900104523, + 0.012667885050177574, + 0.013282978907227516, + 0.013522075489163399, + 0.013718390837311745, + 0.014032709412276745, + 0.015074292197823524, + 0.01619318686425686, + 0.01684875600039959, + 0.016628338024020195, + 0.01641080342233181, + 0.016469109803438187, + 0.016718106344342232, + 0.016970865428447723, + 0.017462197691202164, + 0.018030807375907898, + 0.018617931753396988, + 0.019316717982292175, + 0.02004372887313366, + 0.020825667306780815, + 0.021802233532071114, + 0.022824592888355255, + 0.023839646950364113, + 0.02476741001009941, + 0.02573128044605255, + 0.02650124952197075, + 0.026994090527296066, + 0.0274960957467556, + 0.028234437108039856, + 0.029176007956266403, + 0.030148975551128387, + 0.0313895121216774, + 0.03280426561832428, + 0.03428278863430023, + 0.035739485174417496, + 0.03722824901342392, + 0.03877902403473854, + 0.0398663692176342, + 0.040872056037187576, + 0.04190311208367348, + 0.041935812681913376, + 0.04183521866798401, + 0.04173487424850464, + 0.04265695437788963, + 0.04368806257843971, + 0.0447440966963768, + 0.0457126684486866, + 0.0466955304145813, + 0.04769952967762947, + 0.04834524169564247, + 0.04897996410727501, + 0.049623019993305206, + 0.05024519935250282, + 0.0508732870221138, + 0.051509227603673935, + 0.050492897629737854, + 0.049342114478349686, + 0.04821755364537239, + 0.048491962254047394, + 0.048983823508024216, + 0.04948067292571068, + 0.05043673515319824, + 0.05152445286512375, + 0.05263562873005867, + 0.0524134561419487, + 0.05168813839554787, + 0.05097285658121109, + 0.05143357813358307, + 0.05260857939720154, + 0.05381042882800102, + 0.05367588251829147, + 0.052283819764852524, + 0.05092785879969597, + 0.050112608820199966, + 0.050127528607845306, + 0.05014245584607124, + 0.05000120773911476, + 0.04934808239340782, + 0.04870349168777466, + 0.048087771981954575, + 0.04777339845895767, + 0.04746108502149582, + 0.047150809317827225, + 0.046296339482069016, + 0.04538425803184509, + 0.04449014365673065, + 0.0442984476685524, + 0.044437993317842484, + 0.04457797482609749, + 0.04401498660445213, + 0.04264112189412117, + 0.0413101390004158, + 0.04006998613476753, + 0.03904162347316742, + 0.03803965449333191, + 0.03706339746713638, + 0.03483777493238449, + 0.03269404172897339, + 0.030682222917675972, + 0.02987702563405037, + 0.029598554596304893, + 0.029322678223252296, + 0.0285485927015543, + 0.027040794491767883, + 0.02561263181269169, + 0.02428400330245495, + 0.02331133745610714, + 0.022377628833055496, + 0.02148132026195526, + 0.020866669714450836, + 0.008833167143166065, + 0.009290169924497604, + 0.009770815260708332, + 0.010237547568976879, + 0.010637355037033558, + 0.011052774265408516, + 0.011128108017146587, + 0.010944043286144733, + 0.010763024911284447, + 0.010942229069769382, + 0.01120617613196373, + 0.011485237628221512, + 0.011943541467189789, + 0.01242013368755579, + 0.012858784757554531, + 0.013150535523891449, + 0.013448906131088734, + 0.013804980553686619, + 0.01423111092299223, + 0.014670396223664284, + 0.015210755169391632, + 0.015820639207959175, + 0.016454976052045822, + 0.016809750348329544, + 0.017102254554629326, + 0.017399847507476807, + 0.01827400177717209, + 0.019213085994124413, + 0.020162498578429222, + 0.020812656730413437, + 0.021483778953552246, + 0.022038398310542107, + 0.02211666852235794, + 0.02219521813094616, + 0.02250930294394493, + 0.023331863805651665, + 0.024184487760066986, + 0.025011081248521805, + 0.025781644508242607, + 0.02657594531774521, + 0.027369428426027298, + 0.028158649802207947, + 0.02897062711417675, + 0.02983068861067295, + 0.03073829412460327, + 0.03167351335287094, + 0.03265820071101189, + 0.03368964418768883, + 0.03475365787744522, + 0.035677894949913025, + 0.036505475640296936, + 0.03735224902629852, + 0.038140736520290375, + 0.03889238461852074, + 0.03965884819626808, + 0.040914613753557205, + 0.042561307549476624, + 0.044274281710386276, + 0.045016057789325714, + 0.04493780434131622, + 0.04485968500375748, + 0.04538043960928917, + 0.046503208577632904, + 0.04765375703573227, + 0.04849666729569435, + 0.04892772436141968, + 0.04936262220144272, + 0.05011877045035362, + 0.05146106705069542, + 0.05283931642770767, + 0.05424361303448677, + 0.055653903633356094, + 0.05710085481405258, + 0.05857158079743385, + 0.05999712646007538, + 0.06145736575126648, + 0.06292705237865448, + 0.06224614381790161, + 0.0615726076066494, + 0.06090635061264038, + 0.06023505702614784, + 0.05956919863820076, + 0.05891069397330284, + 0.058456625789403915, + 0.058093875646591187, + 0.05773337557911873, + 0.05782242864370346, + 0.058357011526823044, + 0.05889653414487839, + 0.05895082280039787, + 0.05786541476845741, + 0.0567999929189682, + 0.05568317696452141, + 0.053732845932245255, + 0.0518508218228817, + 0.05003472417593002, + 0.04857886955142021, + 0.0472232848405838, + 0.045905523002147675, + 0.04474719613790512, + 0.04370729997754097, + 0.04269157350063324, + 0.041592907160520554, + 0.04027567803859711, + 0.03900015726685524, + 0.03776503726840019, + 0.03584834188222885, + 0.03402787819504738, + 0.032299868762493134, + 0.03173202648758888, + 0.031675200909376144, + 0.031618475914001465, + 0.030745157971978188, + 0.010452170856297016, + 0.010741032660007477, + 0.011051098816096783, + 0.011370115913450718, + 0.011746898293495178, + 0.012143507599830627, + 0.012541667558252811, + 0.012872498482465744, + 0.013212054967880249, + 0.013556933961808681, + 0.013904604129493237, + 0.014261189848184586, + 0.014652183279395103, + 0.01507098600268364, + 0.015501759946346283, + 0.016119537875056267, + 0.016803236678242683, + 0.01750839874148369, + 0.01763276942074299, + 0.017758024856448174, + 0.017995422706007957, + 0.018713822588324547, + 0.019460901618003845, + 0.020153621211647987, + 0.02071584016084671, + 0.021293742582201958, + 0.022008046507835388, + 0.02286761812865734, + 0.023760762065649033, + 0.024406110867857933, + 0.02490745112299919, + 0.025419089943170547, + 0.026259496808052063, + 0.027233945205807686, + 0.02824455499649048, + 0.029452819377183914, + 0.03074054606258869, + 0.032084573060274124, + 0.03215163201093674, + 0.0321381576359272, + 0.032131537795066833, + 0.032826587557792664, + 0.033536676317453384, + 0.034284479916095734, + 0.03540236875414848, + 0.03655671700835228, + 0.03768584877252579, + 0.03824224695563316, + 0.03880685567855835, + 0.03948226198554039, + 0.040992893278598785, + 0.04256131872534752, + 0.04402191936969757, + 0.04421325773000717, + 0.04440542683005333, + 0.04476311802864075, + 0.04666706919670105, + 0.048652008175849915, + 0.05058397725224495, + 0.05061041936278343, + 0.05063687264919281, + 0.05068664997816086, + 0.05218811333179474, + 0.05373404920101166, + 0.05532578378915787, + 0.05485690385103226, + 0.05428178235888481, + 0.05371268838644028, + 0.05387664958834648, + 0.05415629222989082, + 0.054437387734651566, + 0.054418593645095825, + 0.05430644005537033, + 0.05419451743364334, + 0.05388734117150307, + 0.053474489599466324, + 0.05306480452418327, + 0.05261633172631264, + 0.05213119089603424, + 0.051650520414114, + 0.05160227045416832, + 0.05235039442777634, + 0.053109362721443176, + 0.05349229276180267, + 0.052133962512016296, + 0.05081012845039368, + 0.04951991140842438, + 0.05023705214262009, + 0.05098623409867287, + 0.051746584475040436, + 0.05015760660171509, + 0.0479954369366169, + 0.045926470309495926, + 0.04414858669042587, + 0.04259580373764038, + 0.04109763726592064, + 0.04002022743225098, + 0.03977886587381363, + 0.03953895717859268, + 0.03925473988056183, + 0.03807768598198891, + 0.03693592548370361, + 0.035828400403261185, + 0.03447895869612694, + 0.033100150525569916, + 0.03177648037672043, + 0.03082449920475483, + 0.0302579402923584, + 0.029701797291636467, + 0.029000036418437958, + 0.027459116652607918, + 0.026000071316957474, + 0.02461855113506317, + 0.01158053707331419, + 0.01185176894068718, + 0.01202046312391758, + 0.012191559188067913, + 0.01238312479108572, + 0.012596708722412586, + 0.01281397882848978, + 0.013231118209660053, + 0.013730729930102825, + 0.014249207451939583, + 0.014542278833687305, + 0.014838744886219501, + 0.015296832658350468, + 0.01636740379035473, + 0.01751289889216423, + 0.018496887758374214, + 0.019196903333067894, + 0.019923411309719086, + 0.02006104774773121, + 0.0198286771774292, + 0.01959899812936783, + 0.02015601098537445, + 0.020936977118253708, + 0.021748200058937073, + 0.022121010348200798, + 0.02248135209083557, + 0.02291681058704853, + 0.023949021473526955, + 0.025027727708220482, + 0.02609536424279213, + 0.02701166272163391, + 0.02796013653278351, + 0.028936466202139854, + 0.02993658557534218, + 0.03097127005457878, + 0.032202523201704025, + 0.033686570823192596, + 0.03523901104927063, + 0.03589639440178871, + 0.03572759032249451, + 0.035559576004743576, + 0.03664945065975189, + 0.03866421431303024, + 0.04078973829746246, + 0.041721079498529434, + 0.04196354001760483, + 0.04220741242170334, + 0.04355164244771004, + 0.04548095539212227, + 0.04749573394656181, + 0.048349592834711075, + 0.04867343604564667, + 0.04899943992495537, + 0.04926435276865959, + 0.04950278624892235, + 0.04974237084388733, + 0.05071457847952843, + 0.052065927535295486, + 0.05345328897237778, + 0.05437010899186134, + 0.055016230791807175, + 0.055670030415058136, + 0.055894993245601654, + 0.05581723153591156, + 0.055739570409059525, + 0.05629999190568924, + 0.057468168437480927, + 0.058660585433244705, + 0.058789223432540894, + 0.05751873180270195, + 0.05627570301294327, + 0.055283982306718826, + 0.05476299300789833, + 0.05424690991640091, + 0.05379130318760872, + 0.053551457822322845, + 0.05331268161535263, + 0.0530330091714859, + 0.052182216197252274, + 0.05134508013725281, + 0.0505213737487793, + 0.04941754415631294, + 0.04830973967909813, + 0.04722677543759346, + 0.04588581994175911, + 0.04448484629392624, + 0.04312664642930031, + 0.042083051055669785, + 0.041290346533060074, + 0.0405125729739666, + 0.03983992338180542, + 0.039357852190732956, + 0.03888161480426788, + 0.03827707841992378, + 0.0365571491420269, + 0.03491450473666191, + 0.03334566950798035, + 0.03250807896256447, + 0.03180081024765968, + 0.031108926981687546, + 0.03069201670587063, + 0.03045935183763504, + 0.030228449031710625, + 0.029604898765683174, + 0.02814236655831337, + 0.026752082630991936, + 0.025432532653212547, + 0.024556804448366165, + 0.023711226880550385, + 0.02289476804435253, + 0.022281110286712646, + 0.021762793883681297, + 0.02125653624534607, + 0.011010199785232544, + 0.011307474225759506, + 0.011846735142171383, + 0.01244011614471674, + 0.01298567559570074, + 0.013160331174731255, + 0.013337335549294949, + 0.01357968244701624, + 0.013914449140429497, + 0.014257469214498997, + 0.014972859062254429, + 0.015922607854008675, + 0.016932601109147072, + 0.016950571909546852, + 0.016837632283568382, + 0.01682075671851635, + 0.017740927636623383, + 0.018711434677243233, + 0.019578931853175163, + 0.02008732408285141, + 0.020608915016055107, + 0.021131055429577827, + 0.021651051938533783, + 0.022183846682310104, + 0.022769182920455933, + 0.023394262418150902, + 0.024036504328250885, + 0.02470054104924202, + 0.025384198874235153, + 0.026086779311299324, + 0.027152126654982567, + 0.028301434591412544, + 0.02949422225356102, + 0.03027919866144657, + 0.031085066497325897, + 0.03198055550456047, + 0.03348763287067413, + 0.03506573289632797, + 0.03646847978234291, + 0.03682468831539154, + 0.037184376269578934, + 0.037973981350660324, + 0.04010658338665962, + 0.04235895350575447, + 0.04416107013821602, + 0.0446564182639122, + 0.04515731707215309, + 0.04591590166091919, + 0.04721519351005554, + 0.04855124652385712, + 0.05013028904795647, + 0.05217033624649048, + 0.05429339408874512, + 0.05588797107338905, + 0.05631478875875473, + 0.056744858622550964, + 0.05743015930056572, + 0.058672428131103516, + 0.05994156002998352, + 0.061090756207704544, + 0.06188030168414116, + 0.06268005073070526, + 0.0634574443101883, + 0.06413205713033676, + 0.06481384485960007, + 0.06535902619361877, + 0.06512757390737534, + 0.06489694118499756, + 0.06455903500318527, + 0.062739297747612, + 0.06097084656357765, + 0.05925225093960762, + 0.05916609615087509, + 0.059146035462617874, + 0.059125978499650955, + 0.05697013437747955, + 0.054499972611665726, + 0.05213691666722298, + 0.05028251186013222, + 0.04866674914956093, + 0.047102902084589005, + 0.04562559351325035, + 0.04422504082322121, + 0.04286748170852661, + 0.04158699885010719, + 0.04040609672665596, + 0.03925873339176178, + 0.038137197494506836, + 0.03701440989971161, + 0.035924673080444336, + 0.034867022186517715, + 0.032866496592760086, + 0.03093467839062214, + 0.02911640889942646, + 0.028212955221533775, + 0.027647338807582855, + 0.027093062177300453, + 0.0264446958899498, + 0.025697164237499237, + 0.024970768019557, + 0.024244174361228943, + 0.023460309952497482, + 0.022701788693666458, + 0.021967792883515358, + 0.021139351651072502, + 0.02033202350139618, + 0.019555525854229927, + 0.019175006076693535, + 0.019031710922718048, + 0.01888948865234852, + 0.018540486693382263, + 0.017709042876958847, + 0.016914887353777885, + 0.01018193457275629, + 0.010453564114868641, + 0.010842793621122837, + 0.01131326425820589, + 0.011804148554801941, + 0.012106792069971561, + 0.012394198216497898, + 0.012726403772830963, + 0.013280345126986504, + 0.013858395628631115, + 0.01420392282307148, + 0.014161365106701851, + 0.014118936844170094, + 0.014480186626315117, + 0.015113822184503078, + 0.01577518694102764, + 0.016117895022034645, + 0.01639297790825367, + 0.016680341213941574, + 0.017495956271886826, + 0.018351450562477112, + 0.019185228273272514, + 0.01977619342505932, + 0.020385362207889557, + 0.021007854491472244, + 0.021638918668031693, + 0.022288942709565163, + 0.02380741760134697, + 0.026397721841931343, + 0.029269857332110405, + 0.03038606606423855, + 0.03029722161591053, + 0.030208636075258255, + 0.030714793130755424, + 0.03145477548241615, + 0.03221258521080017, + 0.032933492213487625, + 0.033658649772405624, + 0.03439977392554283, + 0.036040958017110825, + 0.03785989060997963, + 0.03977062180638313, + 0.04085030406713486, + 0.0419263131916523, + 0.043048467487096786, + 0.045794930309057236, + 0.04871661588549614, + 0.05171595886349678, + 0.052213095128536224, + 0.052715003490448, + 0.053299661725759506, + 0.055343545973300934, + 0.057465810328722, + 0.05969296768307686, + 0.06250123679637909, + 0.06544162333011627, + 0.06846246123313904, + 0.06933779269456863, + 0.07022431492805481, + 0.0711221694946289, + 0.07188550382852554, + 0.07265502214431763, + 0.07343277335166931, + 0.0744125097990036, + 0.07541998475790024, + 0.07644110918045044, + 0.07574882358312607, + 0.07478168606758118, + 0.07382689416408539, + 0.07222160696983337, + 0.07045518606901169, + 0.06873197108507156, + 0.06624548882246017, + 0.06345051527023315, + 0.06077347695827484, + 0.058144014328718185, + 0.05557364225387573, + 0.053116895258426666, + 0.051073186099529266, + 0.04956920072436333, + 0.0481095053255558, + 0.04605638608336449, + 0.04210345447063446, + 0.038489796221256256, + 0.03523449972271919, + 0.03309324011206627, + 0.03108210675418377, + 0.029193194583058357, + 0.0278746597468853, + 0.02669072151184082, + 0.025557072833180428, + 0.02451750822365284, + 0.02354511432349682, + 0.022611290216445923, + 0.021840181201696396, + 0.021273726597428322, + 0.02072196453809738, + 0.020099956542253494, + 0.019057996571063995, + 0.018070051446557045, + 0.0171333197504282, + 0.016544930636882782, + 0.01601419970393181, + 0.015500490553677082, + 0.015235439874231815, + 0.015129802748560905, + 0.015024899505078793, + 0.014805945567786694, + 0.01432027481496334, + 0.01385053526610136, + 0.013396205380558968, + 0.013112209737300873, + 0.01283935271203518, + 0.007337603718042374, + 0.007850469090044498, + 0.008182957768440247, + 0.008237543515861034, + 0.008292494341731071, + 0.008368928916752338, + 0.008455394767224789, + 0.00854275468736887, + 0.009021583013236523, + 0.009550204500555992, + 0.01002280693501234, + 0.010126782581210136, + 0.010231836698949337, + 0.01050485298037529, + 0.011040039360523224, + 0.01160249300301075, + 0.012175600975751877, + 0.012765076942741871, + 0.013383092358708382, + 0.013763133436441422, + 0.01408691331744194, + 0.014418310485780239, + 0.01486007310450077, + 0.015317929908633232, + 0.015830064192414284, + 0.016628779470920563, + 0.017467794939875603, + 0.01829872466623783, + 0.019031843170523643, + 0.019794335588812828, + 0.020603539422154427, + 0.021470800042152405, + 0.02237456664443016, + 0.023514606058597565, + 0.024912461638450623, + 0.02639341540634632, + 0.02763730101287365, + 0.02872072532773018, + 0.029846621677279472, + 0.03142058849334717, + 0.03327654302120209, + 0.03524212911725044, + 0.03636539727449417, + 0.0371900349855423, + 0.038033377379179, + 0.04001418501138687, + 0.04242022708058357, + 0.04497094452381134, + 0.047529105097055435, + 0.05019794777035713, + 0.053016647696495056, + 0.057158757001161575, + 0.061892081052064896, + 0.06701737642288208, + 0.07031762599945068, + 0.07327216863632202, + 0.0763508602976799, + 0.08009346574544907, + 0.08416304737329483, + 0.08843941241502762, + 0.09298039972782135, + 0.09777054190635681, + 0.10280747711658478, + 0.10401823371648788, + 0.10351522266864777, + 0.10301464796066284, + 0.10301322489976883, + 0.10331109166145325, + 0.10360982269048691, + 0.10288577526807785, + 0.10128452628850937, + 0.0997081995010376, + 0.09375327825546265, + 0.08282002806663513, + 0.0731617882847786, + 0.06513379514217377, + 0.05906316265463829, + 0.053558334708213806, + 0.048509370535612106, + 0.043649494647979736, + 0.039276499301195145, + 0.03534161299467087, + 0.03299885243177414, + 0.030822569504380226, + 0.028789816424250603, + 0.02625519037246704, + 0.023809904232621193, + 0.021592363715171814, + 0.01990579068660736, + 0.018542855978012085, + 0.01727323979139328, + 0.016196684911847115, + 0.015340064652264118, + 0.014528750441968441, + 0.013793942518532276, + 0.013262254185974598, + 0.012751061469316483, + 0.012259571813046932, + 0.012038740329444408, + 0.011846642941236496, + 0.011657610535621643, + 0.01110988948494196, + 0.01039820909500122, + 0.009732118807733059, + 0.009175566025078297, + 0.008769067004323006, + 0.008380577899515629, + 0.008014288730919361, + 0.007772157900035381, + 0.007537342607975006, + 0.00730962073430419, + 0.007109601050615311, + 0.006923094857484102, + 0.004566853400319815, + 0.00473506934940815, + 0.004924568347632885, + 0.005161954555660486, + 0.0054107834585011005, + 0.005674230866134167, + 0.005952772684395313, + 0.006244988646358252, + 0.00641532801091671, + 0.006555770058184862, + 0.006702149286866188, + 0.006930574309080839, + 0.007166784256696701, + 0.00740429712459445, + 0.007629512343555689, + 0.007861578837037086, + 0.008206471800804138, + 0.00869721733033657, + 0.009217309765517712, + 0.009493084624409676, + 0.00962800532579422, + 0.009764844551682472, + 0.010404577478766441, + 0.011203932575881481, + 0.01206470001488924, + 0.01255724299699068, + 0.013061285018920898, + 0.01359906978905201, + 0.014260382391512394, + 0.014953852631151676, + 0.015741370618343353, + 0.01676497608423233, + 0.017855141311883926, + 0.018951300531625748, + 0.019990956410765648, + 0.02108764834702015, + 0.022186603397130966, + 0.02326829731464386, + 0.024402732029557228, + 0.025725537911057472, + 0.027247454971075058, + 0.02885940484702587, + 0.03061290644109249, + 0.03250774368643761, + 0.03451985865831375, + 0.03685590624809265, + 0.03947650268673897, + 0.04228343814611435, + 0.044481080025434494, + 0.04635053500533104, + 0.04829855635762215, + 0.05252166837453842, + 0.05835681036114693, + 0.06484023481607437, + 0.07107828557491302, + 0.07737072557210922, + 0.08422022312879562, + 0.092289499938488, + 0.10152285546064377, + 0.11167998611927032, + 0.11891703307628632, + 0.12381742149591446, + 0.12891973555088043, + 0.13135360181331635, + 0.13132719695568085, + 0.13130079209804535, + 0.13100694119930267, + 0.13039958477020264, + 0.12979502975940704, + 0.12616272270679474, + 0.11769025772809982, + 0.1097867414355278, + 0.10098645091056824, + 0.08917218446731567, + 0.07874006032943726, + 0.06944459676742554, + 0.06074502691626549, + 0.05313528701663017, + 0.046478841453790665, + 0.040085308253765106, + 0.03456254303455353, + 0.02980067953467369, + 0.02621094137430191, + 0.02315490134060383, + 0.020455176010727882, + 0.01845923624932766, + 0.016860246658325195, + 0.015399765223264694, + 0.014047720469534397, + 0.012793382629752159, + 0.011651046574115753, + 0.010710672475397587, + 0.010174141265451908, + 0.009664487093687057, + 0.009180363267660141, + 0.008664571680128574, + 0.008177091367542744, + 0.007717035710811615, + 0.007317934650927782, + 0.006951557006686926, + 0.006603522226214409, + 0.00623152544721961, + 0.005835416726768017, + 0.00546448677778244, + 0.00513584166765213, + 0.004912267439067364, + 0.004698425997048616, + 0.004493893124163151, + 0.004471326246857643, + 0.004476656671613455, + 0.0044819931499660015, + 0.004374283831566572, + 0.004176059737801552, + 0.006472036708146334, + 0.0066988044418394566, + 0.006943459622561932, + 0.007240260485559702, + 0.007549747359007597, + 0.007815445773303509, + 0.008021651767194271, + 0.008233298547565937, + 0.008674263022840023, + 0.009236549958586693, + 0.009835286065936089, + 0.010361078195273876, + 0.010908342897891998, + 0.011408804915845394, + 0.011543205007910728, + 0.011679187417030334, + 0.011918682605028152, + 0.012341707944869995, + 0.01277974620461464, + 0.013372917659580708, + 0.014109806157648563, + 0.014887300319969654, + 0.01576109044253826, + 0.016706936061382294, + 0.01770954392850399, + 0.018665265291929245, + 0.019658485427498817, + 0.02069934457540512, + 0.02161572501063347, + 0.022572671994566917, + 0.023574048653244972, + 0.024631669744849205, + 0.025736739858984947, + 0.027020055800676346, + 0.028750164434313774, + 0.030591057613492012, + 0.03237223997712135, + 0.033917900174856186, + 0.03553735837340355, + 0.03717692941427231, + 0.03881309926509857, + 0.040521278977394104, + 0.04215315356850624, + 0.04368714988231659, + 0.04527697339653969, + 0.04710374400019646, + 0.04916844144463539, + 0.05132364481687546, + 0.05369575694203377, + 0.05627904459834099, + 0.058986615389585495, + 0.0626978948712349, + 0.06735877692699432, + 0.0723661482334137, + 0.07637365162372589, + 0.0794830471277237, + 0.08271903544664383, + 0.08705068379640579, + 0.09249871224164963, + 0.09828770160675049, + 0.10228648781776428, + 0.10419894754886627, + 0.1061471626162529, + 0.10705605894327164, + 0.1065794825553894, + 0.1061050221323967, + 0.10420574992895126, + 0.09988473355770111, + 0.09574288874864578, + 0.09141549468040466, + 0.08634717762470245, + 0.08155985921621323, + 0.07685129344463348, + 0.07146146148443222, + 0.06644963473081589, + 0.061710767447948456, + 0.05468502640724182, + 0.04845916107296944, + 0.0429421104490757, + 0.0392206609249115, + 0.03596901521086693, + 0.03298695385456085, + 0.029764821752905846, + 0.02668561413884163, + 0.02392495423555374, + 0.021644700318574905, + 0.019736144691705704, + 0.01799587905406952, + 0.016554435715079308, + 0.01549655944108963, + 0.014506286010146141, + 0.013575762510299683, + 0.012680289335548878, + 0.011843882501125336, + 0.01106264628469944, + 0.010442009195685387, + 0.009869983419775963, + 0.009329293854534626, + 0.008852928876876831, + 0.008420407772064209, + 0.008009018376469612, + 0.007601006422191858, + 0.007185202091932297, + 0.006792143452912569, + 0.006430930458009243, + 0.006230042781680822, + 0.006035430356860161, + 0.005846897140145302, + 0.005640017334371805, + 0.005432950332760811, + 0.00523348618298769, + 0.005081143695861101, + 0.004985250066965818, + 0.010437550023198128, + 0.010663467459380627, + 0.010888936929404736, + 0.011091375723481178, + 0.011297577060759068, + 0.011721367947757244, + 0.01246130932122469, + 0.0132479602470994, + 0.013690506108105183, + 0.013961168937385082, + 0.014237182214856148, + 0.014883448369801044, + 0.015594291500747204, + 0.016342762857675552, + 0.0171516090631485, + 0.018000489100813866, + 0.01884043961763382, + 0.01961669884622097, + 0.020424945279955864, + 0.02138472907245159, + 0.022500474005937576, + 0.023674432188272476, + 0.02477938123047352, + 0.025878069922327995, + 0.027025476098060608, + 0.028288204222917557, + 0.02962111122906208, + 0.031016824766993523, + 0.031559329479932785, + 0.03211004287004471, + 0.0328344851732254, + 0.03479539602994919, + 0.036873411387205124, + 0.03887307643890381, + 0.040279828011989594, + 0.04173748567700386, + 0.04342854022979736, + 0.04558415710926056, + 0.047846775501966476, + 0.04938923940062523, + 0.049712885171175, + 0.0500386543571949, + 0.05092894285917282, + 0.05252097547054291, + 0.05416277423501015, + 0.055685579776763916, + 0.05707692354917526, + 0.05850302428007126, + 0.05993249639868736, + 0.06136715039610863, + 0.06283614784479141, + 0.06531219184398651, + 0.06877533346414566, + 0.0724221020936966, + 0.07427207380533218, + 0.07438580691814423, + 0.07449971139431, + 0.07525165379047394, + 0.07665408402681351, + 0.07808265089988708, + 0.07921823114156723, + 0.0799926146864891, + 0.08077456057071686, + 0.08024828135967255, + 0.07781874388456345, + 0.07546275109052658, + 0.07284225523471832, + 0.06964629888534546, + 0.0665905550122261, + 0.06405787169933319, + 0.06287577003240585, + 0.06171547621488571, + 0.060188762843608856, + 0.056026801466941833, + 0.05215263366699219, + 0.048546358942985535, + 0.04512547701597214, + 0.041945211589336395, + 0.038989078253507614, + 0.03636913746595383, + 0.0339469313621521, + 0.031686048954725266, + 0.02958262339234352, + 0.02762182056903839, + 0.025790985673666, + 0.02403043396770954, + 0.022342734038829803, + 0.02077356167137623, + 0.01942717283964157, + 0.01841478981077671, + 0.017455166205763817, + 0.01653522439301014, + 0.015556600876152515, + 0.014635897241532803, + 0.013769685290753841, + 0.012995066121220589, + 0.012270886451005936, + 0.011587063781917095, + 0.01116015575826168, + 0.01089581847190857, + 0.010637743398547173, + 0.010285738855600357, + 0.009743787348270416, + 0.00923039112240076, + 0.008753723464906216, + 0.008603435941040516, + 0.008455729112029076, + 0.008310558274388313, + 0.008014945313334465, + 0.007673412561416626, + 0.007346433121711016, + 0.007122303359210491, + 0.00704059237614274, + 0.012062064372003078, + 0.012299995869398117, + 0.01260455697774887, + 0.013185220770537853, + 0.013792633078992367, + 0.014294622465968132, + 0.01465397235006094, + 0.015022356994450092, + 0.015782542526721954, + 0.016747599467635155, + 0.01777166686952114, + 0.01849588006734848, + 0.019228432327508926, + 0.019958671182394028, + 0.02055441215634346, + 0.0211679395288229, + 0.02203231491148472, + 0.02334880828857422, + 0.02474396489560604, + 0.025852885097265244, + 0.026711028069257736, + 0.02759765461087227, + 0.029364963993430138, + 0.031583815813064575, + 0.03397032991051674, + 0.035613398998975754, + 0.037216462194919586, + 0.038874682039022446, + 0.04002761468291283, + 0.04121474176645279, + 0.04240304231643677, + 0.04343404993414879, + 0.044490132480859756, + 0.04592582955956459, + 0.04844910651445389, + 0.051111020147800446, + 0.05312154069542885, + 0.053734298795461655, + 0.05435413122177124, + 0.05495338514447212, + 0.05552217736840248, + 0.05609685182571411, + 0.0568109005689621, + 0.057675182819366455, + 0.05855260789394379, + 0.060105811804533005, + 0.06230366975069046, + 0.06458189338445663, + 0.06651321053504944, + 0.06815381348133087, + 0.0698348805308342, + 0.07044535130262375, + 0.07021826505661011, + 0.06999190896749496, + 0.06918969005346298, + 0.06795204430818558, + 0.06673653423786163, + 0.06599776446819305, + 0.06566020101308823, + 0.06532435864210129, + 0.06548429280519485, + 0.06615637242794037, + 0.06683535128831863, + 0.06631089746952057, + 0.06426266580820084, + 0.062277693301439285, + 0.06041116639971733, + 0.05869968980550766, + 0.05703670531511307, + 0.05521440505981445, + 0.05290157347917557, + 0.05068562552332878, + 0.0483941026031971, + 0.04533790051937103, + 0.04247470572590828, + 0.039816368371248245, + 0.038164593279361725, + 0.03658134490251541, + 0.03506377339363098, + 0.03269468992948532, + 0.030371692031621933, + 0.02821374498307705, + 0.026468832045793533, + 0.024928787723183632, + 0.023478349670767784, + 0.02213285304605961, + 0.020881302654743195, + 0.01970052532851696, + 0.01868368312716484, + 0.01790308952331543, + 0.017155112698674202, + 0.016441119834780693, + 0.015776434913277626, + 0.015138624235987663, + 0.014526598155498505, + 0.01358060073107481, + 0.012652200646698475, + 0.011787268333137035, + 0.011319967918097973, + 0.011067972518503666, + 0.010821588337421417, + 0.010536967776715755, + 0.010183386504650116, + 0.009841669350862503, + 0.00950656458735466, + 0.009116366505622864, + 0.008742185309529305, + 0.008383361622691154, + 0.008268645033240318, + 0.008229716680943966, + 0.008190971799194813, + 0.007987779565155506, + 0.0075805289670825005, + 0.013729328289628029, + 0.014204123057425022, + 0.014651707373559475, + 0.014999032951891422, + 0.015354589559137821, + 0.016043005511164665, + 0.01704677753150463, + 0.018113352358341217, + 0.01896974816918373, + 0.019794752821326256, + 0.020639274269342422, + 0.021068263798952103, + 0.021506166085600853, + 0.02229873277246952, + 0.024191100150346756, + 0.026244061067700386, + 0.027734948322176933, + 0.02842753939330578, + 0.029137426987290382, + 0.03015385940670967, + 0.031367555260658264, + 0.03263010084629059, + 0.03444669395685196, + 0.03647914156317711, + 0.03863151744008064, + 0.040017981082201004, + 0.041436489671468735, + 0.042844273149967194, + 0.04384980723261833, + 0.044878941029310226, + 0.04600326716899872, + 0.047377899289131165, + 0.04879361018538475, + 0.0502142459154129, + 0.05160686373710632, + 0.0530381016433239, + 0.05455637350678444, + 0.05617792159318924, + 0.05784766376018524, + 0.05874180048704147, + 0.05890246108174324, + 0.05906355381011963, + 0.060422349721193314, + 0.06269587576389313, + 0.06505496054887772, + 0.06622843444347382, + 0.06666722893714905, + 0.06710894405841827, + 0.06666063517332077, + 0.06575248390436172, + 0.06485670804977417, + 0.06454683095216751, + 0.06452850997447968, + 0.06451019644737244, + 0.06418532878160477, + 0.06370380520820618, + 0.0632258951663971, + 0.06262201815843582, + 0.06194979324936867, + 0.06128479167819023, + 0.05988099426031113, + 0.05801309272646904, + 0.0562034547328949, + 0.054790250957012177, + 0.05370328202843666, + 0.05263787508010864, + 0.05159635469317436, + 0.050578612834215164, + 0.04958094656467438, + 0.04820270463824272, + 0.046196043491363525, + 0.04427291825413704, + 0.04234478995203972, + 0.040264710783958435, + 0.03828681260347366, + 0.036381885409355164, + 0.03441541641950607, + 0.0325552374124527, + 0.03079560212790966, + 0.029216991737484932, + 0.027720756828784943, + 0.026301145553588867, + 0.02499903365969658, + 0.023770786821842194, + 0.022602884098887444, + 0.02158675529062748, + 0.02066754922270775, + 0.019787484779953957, + 0.018957432359457016, + 0.01817753165960312, + 0.017429713159799576, + 0.016723202541470528, + 0.016080716624855995, + 0.015462913550436497, + 0.014868846163153648, + 0.014200348407030106, + 0.013560726307332516, + 0.012949913740158081, + 0.012567523866891861, + 0.012267815880477428, + 0.011975254863500595, + 0.011668708175420761, + 0.011346315033733845, + 0.01103282906115055, + 0.010707597248256207, + 0.010297391563653946, + 0.009902901947498322, + 0.009523522108793259, + 0.009316354058682919, + 0.009138260968029499, + 0.008963570930063725, + 0.008820355869829655, + 0.008703424595296383, + 0.0161787997931242, + 0.017443643882870674, + 0.018286749720573425, + 0.01846517249941826, + 0.018645336851477623, + 0.019780442118644714, + 0.02144227921962738, + 0.023243729025125504, + 0.023371078073978424, + 0.023403218016028404, + 0.023618578910827637, + 0.024665599688887596, + 0.02575903758406639, + 0.026615263894200325, + 0.02707497961819172, + 0.027542635798454285, + 0.028766751289367676, + 0.030550725758075714, + 0.032445333898067474, + 0.033574383705854416, + 0.03452124819159508, + 0.03549481928348541, + 0.03626879304647446, + 0.037054065614938736, + 0.03792159631848335, + 0.039241593331098557, + 0.04060753807425499, + 0.04184725135564804, + 0.042660295963287354, + 0.043489135801792145, + 0.04459774121642113, + 0.04613843187689781, + 0.04773235693573952, + 0.04936477169394493, + 0.051036734133958817, + 0.05276532098650932, + 0.05414151772856712, + 0.055281322449445724, + 0.05644511803984642, + 0.05709265545010567, + 0.05749582126736641, + 0.05790184065699577, + 0.058943603187799454, + 0.06022743135690689, + 0.06153922900557518, + 0.061672087758779526, + 0.06148386001586914, + 0.06129620969295502, + 0.06068792566657066, + 0.05999172106385231, + 0.05930350348353386, + 0.05962235853075981, + 0.06015644967556, + 0.06069532409310341, + 0.05980953201651573, + 0.05863188952207565, + 0.057477425783872604, + 0.05654222145676613, + 0.05567162111401558, + 0.054814424365758896, + 0.05321309715509415, + 0.051424384117126465, + 0.04969580098986626, + 0.04938189312815666, + 0.04966086894273758, + 0.049941420555114746, + 0.04830699786543846, + 0.045647505670785904, + 0.043134432286024094, + 0.04177659749984741, + 0.04134446755051613, + 0.0409168042242527, + 0.03993208333849907, + 0.03823801875114441, + 0.036615822464227676, + 0.035138316452503204, + 0.03389348089694977, + 0.032692745327949524, + 0.031628768891096115, + 0.031111180782318115, + 0.030602063983678818, + 0.03010127879679203, + 0.028607919812202454, + 0.027179479598999023, + 0.025822363793849945, + 0.024716515094041824, + 0.02369934320449829, + 0.022724030539393425, + 0.021779047325253487, + 0.02086741477251053, + 0.019993940368294716, + 0.019249415025115013, + 0.01866891421377659, + 0.018105918541550636, + 0.017613016068935394, + 0.01740284264087677, + 0.01719517447054386, + 0.01698998734354973, + 0.016332322731614113, + 0.015657473355531693, + 0.015010509639978409, + 0.014450693503022194, + 0.013944682665169239, + 0.013456391170620918, + 0.013070745393633842, + 0.012851817533373833, + 0.012636556290090084, + 0.012432439252734184, + 0.012399707920849323, + 0.012367061339318752, + 0.012334502302110195, + 0.011911808513104916, + 0.011357619427144527, + 0.017283231019973755, + 0.01769537292420864, + 0.018297085538506508, + 0.019027607515454292, + 0.019787296652793884, + 0.020536480471491814, + 0.02130945771932602, + 0.02217123471200466, + 0.02340656705200672, + 0.024710731580853462, + 0.025830551981925964, + 0.026593444868922234, + 0.02737887017428875, + 0.027601532638072968, + 0.027465127408504486, + 0.027329396456480026, + 0.028984179720282555, + 0.03116162121295929, + 0.03348298370838165, + 0.03459527716040611, + 0.03574451804161072, + 0.03700125589966774, + 0.03860953822731972, + 0.040287721902132034, + 0.04125802591443062, + 0.04080212488770485, + 0.0403512604534626, + 0.040583156049251556, + 0.04153013974428177, + 0.04249921813607216, + 0.04368092119693756, + 0.045015573501586914, + 0.04639100655913353, + 0.047166984528303146, + 0.047718215733766556, + 0.0482758954167366, + 0.048858415335416794, + 0.049451883882284164, + 0.05005255714058876, + 0.05130302533507347, + 0.05265498161315918, + 0.05404256284236908, + 0.05437531694769859, + 0.05467204749584198, + 0.05498828366398811, + 0.05686965212225914, + 0.05881538242101669, + 0.0606989748775959, + 0.059551626443862915, + 0.05842597410082817, + 0.05737733840942383, + 0.05735206976532936, + 0.05732681602239609, + 0.05719410628080368, + 0.0549413338303566, + 0.05277729779481888, + 0.05077028274536133, + 0.05156475678086281, + 0.05237165838479996, + 0.05319118872284889, + 0.050756003707647324, + 0.048391032963991165, + 0.04613626003265381, + 0.04537280648946762, + 0.04472547769546509, + 0.044087376445531845, + 0.04340188577771187, + 0.04271780326962471, + 0.042044498026371, + 0.04088309779763222, + 0.03960741311311722, + 0.03837153688073158, + 0.037955790758132935, + 0.03795137256383896, + 0.03794695809483528, + 0.037108294665813446, + 0.0355888232588768, + 0.034131571650505066, + 0.0330982431769371, + 0.032656241208314896, + 0.03222014382481575, + 0.03183607757091522, + 0.03161052241921425, + 0.031386565417051315, + 0.031069539487361908, + 0.02905089780688286, + 0.027163412421941757, + 0.025398558005690575, + 0.02487172558903694, + 0.024548912420868874, + 0.024230286478996277, + 0.023608552291989326, + 0.022835658863186836, + 0.0220880676060915, + 0.021470967680215836, + 0.021022368222475052, + 0.0205831415951252, + 0.020204374566674232, + 0.02010766603052616, + 0.02001142129302025, + 0.019915638491511345, + 0.019231745973229408, + 0.018499797210097313, + 0.017795706167817116, + 0.017187152057886124, + 0.01664404198527336, + 0.016118092462420464, + 0.015704985707998276, + 0.015531562268733978, + 0.015360054560005665, + 0.01519043929874897, + 0.01480689737945795, + 0.014426060020923615, + 0.014595543965697289, + 0.015046199783682823, + 0.01597251184284687, + 0.0170129481703043, + 0.01799285039305687, + 0.018369562923908234, + 0.01875416189432144, + 0.019369812682271004, + 0.020324505865573883, + 0.021326255053281784, + 0.022316472604870796, + 0.023320242762565613, + 0.024369163438677788, + 0.025161977857351303, + 0.025940723717212677, + 0.026705512776970863, + 0.027121527120471, + 0.027544019743800163, + 0.028173908591270447, + 0.029333725571632385, + 0.03054128773510456, + 0.031901855021715164, + 0.03344796597957611, + 0.03506900742650032, + 0.036536697298288345, + 0.03792168200016022, + 0.03935916721820831, + 0.04047431796789169, + 0.0415060892701149, + 0.04256415367126465, + 0.044398147612810135, + 0.0463998056948185, + 0.048477694392204285, + 0.049409862607717514, + 0.05035994574427605, + 0.05131252110004425, + 0.05215029418468475, + 0.05300174653530121, + 0.05394616723060608, + 0.055256690829992294, + 0.056599050760269165, + 0.05818047747015953, + 0.06044250354170799, + 0.06279247999191284, + 0.06381099671125412, + 0.06156929209828377, + 0.0594063326716423, + 0.05814177915453911, + 0.05858450010418892, + 0.05903058499097824, + 0.05930563807487488, + 0.059246573597192764, + 0.05918757990002632, + 0.05884965509176254, + 0.057976461946964264, + 0.057116229087114334, + 0.05583333969116211, + 0.05368068069219589, + 0.05161102116107941, + 0.04976537078619003, + 0.04834239184856415, + 0.046960096806287766, + 0.045787226408720016, + 0.045211631804704666, + 0.044643279165029526, + 0.04406509920954704, + 0.043403688818216324, + 0.042752206325531006, + 0.04212115705013275, + 0.04164641723036766, + 0.04117702692747116, + 0.04071292653679848, + 0.039052560925483704, + 0.03741326928138733, + 0.035842783749103546, + 0.03507079556584358, + 0.03445711359381676, + 0.033854175359010696, + 0.03314712271094322, + 0.03240576013922691, + 0.03168097510933876, + 0.03069564513862133, + 0.02951093018054962, + 0.028371937572956085, + 0.027468599379062653, + 0.026928288862109184, + 0.026398606598377228, + 0.02597261220216751, + 0.02602499909698963, + 0.026077495887875557, + 0.02613009326159954, + 0.02511783316731453, + 0.02409375086426735, + 0.02311141975224018, + 0.02254904992878437, + 0.022145826369524002, + 0.021749811246991158, + 0.021473070606589317, + 0.021324753761291504, + 0.021177463233470917, + 0.02088603936135769, + 0.0200490802526474, + 0.019245658069849014, + 0.018474433571100235, + 0.017960013821721077, + 0.017479676753282547, + 0.017012184485793114, + 0.016563229262828827, + 0.016129817813634872, + 0.015707749873399734, + 0.015335791744291782, + 0.015066228806972504, + 0.014801404438912868, + 0.013493756763637066, + 0.01387897226959467, + 0.01460917480289936, + 0.015377795323729515, + 0.016010863706469536, + 0.01648223213851452, + 0.016967475414276123, + 0.017691180109977722, + 0.018525153398513794, + 0.019398439675569534, + 0.02000836655497551, + 0.020634163171052933, + 0.021353766322135925, + 0.022380603477358818, + 0.023456823080778122, + 0.024625886231660843, + 0.025911547243595123, + 0.02726433053612709, + 0.028308263048529625, + 0.02915342152118683, + 0.030023811385035515, + 0.030815085396170616, + 0.03160010650753975, + 0.032405126839876175, + 0.033869363367557526, + 0.03542665019631386, + 0.03697000816464424, + 0.03785465285181999, + 0.0387604720890522, + 0.03969932347536087, + 0.04069794714450836, + 0.04172169044613838, + 0.043264929205179214, + 0.045816048979759216, + 0.04851759597659111, + 0.050493333488702774, + 0.05145393684506416, + 0.052432820200920105, + 0.05362257361412048, + 0.05501154437661171, + 0.05643649026751518, + 0.0571867860853672, + 0.05747010558843613, + 0.05775482580065727, + 0.05827925354242325, + 0.058939266949892044, + 0.05960675701498985, + 0.06009344756603241, + 0.060495197772979736, + 0.060899633914232254, + 0.06007686257362366, + 0.05874330550432205, + 0.05743934586644173, + 0.05698906630277634, + 0.056905414909124374, + 0.05682188645005226, + 0.05574885383248329, + 0.05423819646239281, + 0.05276846885681152, + 0.05177043378353119, + 0.051029615104198456, + 0.050299398601055145, + 0.04935797303915024, + 0.04828307405114174, + 0.04723158851265907, + 0.04635092616081238, + 0.04562126845121384, + 0.044903095811605453, + 0.043934959918260574, + 0.04265502095222473, + 0.04141237586736679, + 0.04027564078569412, + 0.039308976382017136, + 0.03836550936102867, + 0.03743123263120651, + 0.03646942228078842, + 0.03553231805562973, + 0.0346737764775753, + 0.0345781110227108, + 0.03448271378874779, + 0.03438757359981537, + 0.033405207097530365, + 0.03236743435263634, + 0.0313619002699852, + 0.030714906752109528, + 0.030197234824299812, + 0.029688291251659393, + 0.029003961011767387, + 0.028185047209262848, + 0.027389254420995712, + 0.02669796347618103, + 0.026185553520917892, + 0.025682978332042694, + 0.0252021923661232, + 0.02483392134308815, + 0.02447103150188923, + 0.024113446474075317, + 0.02330951578915119, + 0.022460026666522026, + 0.021641498431563377, + 0.02100909687578678, + 0.020500797778367996, + 0.020004795864224434, + 0.019460180774331093, + 0.018798204138875008, + 0.018158745020627975, + 0.017544183880090714, + 0.017546840012073517, + 0.01754949241876602, + 0.017552144825458527, + 0.016904082149267197, + 0.015998665243387222, + 0.01514174323529005, + 0.012824160046875477, + 0.013486359268426895, + 0.014195381663739681, + 0.014941681176424026, + 0.015518754720687866, + 0.016086740419268608, + 0.01664281077682972, + 0.016996577382087708, + 0.01735786348581314, + 0.017748698592185974, + 0.01818561553955078, + 0.018633291125297546, + 0.019368592649698257, + 0.02032422460615635, + 0.021327007561922073, + 0.022263096645474434, + 0.023212973028421402, + 0.024190960451960564, + 0.024208057671785355, + 0.02422516793012619, + 0.024474389851093292, + 0.025728635489940643, + 0.027047155424952507, + 0.028283363208174706, + 0.02929755486547947, + 0.030348118394613266, + 0.031724635511636734, + 0.033458709716796875, + 0.03528757393360138, + 0.036365609616041183, + 0.03699319064617157, + 0.03763160482048988, + 0.03866386041045189, + 0.039851367473602295, + 0.04107534885406494, + 0.04436947777867317, + 0.04830187186598778, + 0.05258278548717499, + 0.051390793174505234, + 0.049893297255039215, + 0.04847286269068718, + 0.050502385944128036, + 0.05261687934398651, + 0.05468267202377319, + 0.05468018725514412, + 0.05467769503593445, + 0.05462973937392235, + 0.05415390059351921, + 0.05368221178650856, + 0.05329604819417, + 0.05354825779795647, + 0.053801655769348145, + 0.05396055430173874, + 0.053383950144052505, + 0.05281350761651993, + 0.05231605842709541, + 0.052431873977184296, + 0.05254795029759407, + 0.05257071182131767, + 0.05128530040383339, + 0.05003131553530693, + 0.04882460832595825, + 0.048652008175849915, + 0.04848001152276993, + 0.04830862581729889, + 0.04843081161379814, + 0.04856915771961212, + 0.04870789870619774, + 0.04835150018334389, + 0.047921083867549896, + 0.047494497150182724, + 0.04647230729460716, + 0.04529120773077011, + 0.044140126556158066, + 0.043457768857479095, + 0.0430276095867157, + 0.04260171577334404, + 0.042064666748046875, + 0.0414237417280674, + 0.04079258069396019, + 0.03979315981268883, + 0.03814884275197983, + 0.036572471261024475, + 0.03537352755665779, + 0.03562706336379051, + 0.035882413387298584, + 0.0361395999789238, + 0.03489672392606735, + 0.033681560307741165, + 0.03250870853662491, + 0.03165244683623314, + 0.030894335359334946, + 0.030154377222061157, + 0.029809460043907166, + 0.029771041125059128, + 0.02973266877233982, + 0.02923843078315258, + 0.027781330049037933, + 0.026396842673420906, + 0.025111157447099686, + 0.024460481479763985, + 0.023826666176319122, + 0.02320927381515503, + 0.02249601110816002, + 0.021771760657429695, + 0.021070828661322594, + 0.02045321650803089, + 0.01992124319076538, + 0.01940310373902321, + 0.01886889897286892, + 0.018185744062066078, + 0.017527321353554726, + 0.01689273864030838, + 0.010695982724428177, + 0.011421759612858295, + 0.01219678483903408, + 0.012850119732320309, + 0.013141483999788761, + 0.013439453206956387, + 0.013906692154705524, + 0.014516696333885193, + 0.015153458341956139, + 0.015434931963682175, + 0.015636801719665527, + 0.015858272090554237, + 0.016414549201726913, + 0.016990339383482933, + 0.017546609044075012, + 0.018007682636380196, + 0.018480870872735977, + 0.01889212243258953, + 0.019225088879466057, + 0.01956392452120781, + 0.02034488134086132, + 0.021408116444945335, + 0.02252691425383091, + 0.023101646453142166, + 0.023553039878606796, + 0.024013251066207886, + 0.025548648089170456, + 0.02722216583788395, + 0.028863051906228065, + 0.029310395941138268, + 0.029764672741293907, + 0.030473247170448303, + 0.03210412710905075, + 0.03382229059934616, + 0.03532751277089119, + 0.03624643385410309, + 0.03718925639986992, + 0.038404401391744614, + 0.04002787917852402, + 0.04171999171376228, + 0.04295315220952034, + 0.04364345222711563, + 0.04434484615921974, + 0.04544560983777046, + 0.046920739114284515, + 0.0484437569975853, + 0.04928167909383774, + 0.049584973603487015, + 0.04989013075828552, + 0.05116914585232735, + 0.053173813968896866, + 0.055257026106119156, + 0.05528835952281952, + 0.05392741411924362, + 0.05259997025132179, + 0.05248337984085083, + 0.053218916058540344, + 0.0539647601544857, + 0.05512476712465286, + 0.0566432848572731, + 0.05820363014936447, + 0.05829516053199768, + 0.056952983140945435, + 0.05564170703291893, + 0.05471903830766678, + 0.05425814911723137, + 0.053801149129867554, + 0.05334068462252617, + 0.05287136137485504, + 0.05240616947412491, + 0.05207299813628197, + 0.052101004868745804, + 0.052129022777080536, + 0.052075594663619995, + 0.05154836177825928, + 0.051026467233896255, + 0.05049978941679001, + 0.04915652796626091, + 0.04784900322556496, + 0.04657625034451485, + 0.045289695262908936, + 0.04403115063905716, + 0.042807579040527344, + 0.041934192180633545, + 0.04121807590126991, + 0.04051418974995613, + 0.0395331084728241, + 0.03829938545823097, + 0.03710415959358215, + 0.03634165972471237, + 0.03652392700314522, + 0.036707110702991486, + 0.0367894247174263, + 0.035630639642477036, + 0.034508347511291504, + 0.033421408385038376, + 0.0321224182844162, + 0.030826721340417862, + 0.029583290219306946, + 0.028353193774819374, + 0.027148013934493065, + 0.025994064286351204, + 0.024985386058688164, + 0.024238221347332, + 0.023513397201895714, + 0.022810248658061028, + 0.02244466170668602, + 0.022085415199398994, + 0.021731922402977943, + 0.020992761477828026, + 0.020105788484215736, + 0.019256290048360825, + 0.018544752150774002, + 0.006028435193002224, + 0.006190395448356867, + 0.006345564965158701, + 0.006513205822557211, + 0.0068610901944339275, + 0.007227555848658085, + 0.007542761508375406, + 0.007708427961915731, + 0.007877732627093792, + 0.008113367483019829, + 0.008408541791141033, + 0.008714452385902405, + 0.0088555458933115, + 0.008949722163379192, + 0.009044899605214596, + 0.009974396787583828, + 0.01100374199450016, + 0.011969642713665962, + 0.012277316302061081, + 0.012592898681759834, + 0.012742861174046993, + 0.012607062235474586, + 0.012472710572183132, + 0.012880218215286732, + 0.01379322074353695, + 0.014770939014852047, + 0.015145706944167614, + 0.015231725759804249, + 0.015318231657147408, + 0.01583065092563629, + 0.016454797238111496, + 0.01710355095565319, + 0.01808685064315796, + 0.019146552309393883, + 0.020243758335709572, + 0.020856404677033424, + 0.021487588062882423, + 0.022085728123784065, + 0.02234504744410515, + 0.022607412189245224, + 0.023029552772641182, + 0.02411380596458912, + 0.02524910494685173, + 0.026277098804712296, + 0.026854220777750015, + 0.027444016188383102, + 0.028189318254590034, + 0.0293221864849329, + 0.030500581488013268, + 0.031906843185424805, + 0.03381059691309929, + 0.035827942192554474, + 0.03729785606265068, + 0.03731017932295799, + 0.0373225137591362, + 0.038179345428943634, + 0.041219089180231094, + 0.04450085014104843, + 0.04683731868863106, + 0.045879848301410675, + 0.04494195058941841, + 0.04443555325269699, + 0.04547727853059769, + 0.0465434230864048, + 0.047758232802152634, + 0.04974927008152008, + 0.05182331055402756, + 0.053865958005189896, + 0.05421078950166702, + 0.054557837545871735, + 0.05490710586309433, + 0.05699197202920914, + 0.059226736426353455, + 0.06154912710189819, + 0.06170186027884483, + 0.06144675239920616, + 0.061192695051431656, + 0.06252273917198181, + 0.06455808132886887, + 0.06665968894958496, + 0.06733193248510361, + 0.06682399660348892, + 0.06631989777088165, + 0.06605060398578644, + 0.06615269184112549, + 0.06625494360923767, + 0.06605493277311325, + 0.06462714076042175, + 0.06323021650314331, + 0.061863481998443604, + 0.06120174378156662, + 0.060555145144462585, + 0.05991537868976593, + 0.05959818512201309, + 0.05938056856393814, + 0.05916374921798706, + 0.05716995149850845, + 0.0537019819021225, + 0.05044438689947128, + 0.047745537012815475, + 0.04618791863322258, + 0.044681113213300705, + 0.04322346672415733, + 0.043528731912374496, + 0.043875496834516525, + 0.044225018471479416, + 0.04216475039720535, + 0.03916027396917343, + 0.03636987879872322, + 0.0337480753660202, + 0.031266000121831894, + 0.028966469690203667, + 0.02685440517961979, + 0.008763090707361698, + 0.009120614267885685, + 0.009457952342927456, + 0.009807766415178776, + 0.009985372424125671, + 0.010046778246760368, + 0.010108561255037785, + 0.010391871444880962, + 0.010718685574829578, + 0.011039706878364086, + 0.011234946548938751, + 0.011433637700974941, + 0.011742804199457169, + 0.012281559407711029, + 0.012845031917095184, + 0.013427559286355972, + 0.014030592516064644, + 0.014660710468888283, + 0.014971827156841755, + 0.015167470090091228, + 0.015365669503808022, + 0.01581052504479885, + 0.016290178522467613, + 0.01680471934378147, + 0.017566468566656113, + 0.01836274564266205, + 0.019121328368782997, + 0.019658053293824196, + 0.020209845155477524, + 0.020830906927585602, + 0.021568775177001953, + 0.022332781925797462, + 0.023129668086767197, + 0.02396157570183277, + 0.024823402985930443, + 0.02544115111231804, + 0.025869466364383698, + 0.02630499191582203, + 0.027008432894945145, + 0.027869800105690956, + 0.028758637607097626, + 0.03030042164027691, + 0.03217710927128792, + 0.034170035272836685, + 0.035125356167554855, + 0.035768937319517136, + 0.03642430901527405, + 0.03728317469358444, + 0.03820889815688133, + 0.03915760666131973, + 0.03996562212705612, + 0.04075475037097931, + 0.04155946895480156, + 0.04263700544834137, + 0.04379894584417343, + 0.04499255120754242, + 0.04551536962389946, + 0.04587535560131073, + 0.046238191425800323, + 0.0468779020011425, + 0.04760872945189476, + 0.04835095256567001, + 0.050030745565891266, + 0.05214518681168556, + 0.054348986595869064, + 0.05501667037606239, + 0.05483129993081093, + 0.054646555334329605, + 0.05472678318619728, + 0.055011164397001266, + 0.05529703572392464, + 0.05593389272689819, + 0.05699208006262779, + 0.05807027965784073, + 0.05858595669269562, + 0.05798763036727905, + 0.057395417243242264, + 0.05691139027476311, + 0.056831419467926025, + 0.056751564145088196, + 0.05668434128165245, + 0.056874144822359085, + 0.05706458166241646, + 0.05725565925240517, + 0.0574750192463398, + 0.057699281722307205, + 0.05792441591620445, + 0.05683151260018349, + 0.055161911994218826, + 0.053541358560323715, + 0.0522879958152771, + 0.05141745135188103, + 0.05056140571832657, + 0.049640361219644547, + 0.04849382862448692, + 0.04737377539277077, + 0.04627959430217743, + 0.0445675328373909, + 0.04291649907827377, + 0.041326627135276794, + 0.040166109800338745, + 0.0391710102558136, + 0.03820056468248367, + 0.03706003725528717, + 0.035723600536584854, + 0.03443535417318344, + 0.03320159390568733, + 0.03205686807632446, + 0.030951611697673798, + 0.02988446317613125, + 0.028718212619423866, + 0.02757028490304947, + 0.026468243449926376, + 0.010236550122499466, + 0.010576887987554073, + 0.01075767632573843, + 0.010933566838502884, + 0.01111621130257845, + 0.011315383948385715, + 0.011518124490976334, + 0.011833772994577885, + 0.012279924005270004, + 0.012742896564304829, + 0.013221146538853645, + 0.01371647510677576, + 0.01423036027699709, + 0.014811179600656033, + 0.015418528579175472, + 0.015985190868377686, + 0.01620679534971714, + 0.016431471332907677, + 0.016758883371949196, + 0.01728481985628605, + 0.017827261239290237, + 0.01849701814353466, + 0.01929600164294243, + 0.020129496231675148, + 0.02061399817466736, + 0.020932449027895927, + 0.021255820989608765, + 0.022037658840417862, + 0.022944597527384758, + 0.023888859897851944, + 0.024906350299715996, + 0.025968635454773903, + 0.027053270488977432, + 0.0278847124427557, + 0.028741709887981415, + 0.029594460502266884, + 0.030319763347506523, + 0.031062843278050423, + 0.031890902668237686, + 0.03294665366411209, + 0.03403735160827637, + 0.03518534451723099, + 0.036419790238142014, + 0.03769754618406296, + 0.03886041417717934, + 0.0397707000374794, + 0.04070231318473816, + 0.04188837483525276, + 0.04348188266158104, + 0.04513601213693619, + 0.04628627374768257, + 0.04663029685616493, + 0.04697687178850174, + 0.047672126442193985, + 0.04890109971165657, + 0.050161756575107574, + 0.051312342286109924, + 0.052256111055612564, + 0.05321723595261574, + 0.05408551171422005, + 0.05475722253322601, + 0.05543728172779083, + 0.05600156635046005, + 0.056270092725753784, + 0.056539904326200485, + 0.05680479109287262, + 0.05704903602600098, + 0.0572943314909935, + 0.05743198096752167, + 0.05686718225479126, + 0.05630793422460556, + 0.0557786226272583, + 0.05611759051680565, + 0.056458622217178345, + 0.05680172145366669, + 0.05554400756955147, + 0.05415039509534836, + 0.052791744470596313, + 0.05278945341706276, + 0.05320466682314873, + 0.05362314358353615, + 0.052879247814416885, + 0.051406461745500565, + 0.04997469484806061, + 0.048844434320926666, + 0.04808400198817253, + 0.04733540490269661, + 0.04650125280022621, + 0.04536937177181244, + 0.04426504671573639, + 0.04318809509277344, + 0.0421600416302681, + 0.04115645959973335, + 0.040176764130592346, + 0.03921685367822647, + 0.03827895224094391, + 0.037363484501838684, + 0.03662119433283806, + 0.036019712686538696, + 0.03542810678482056, + 0.03447679430246353, + 0.03261841461062431, + 0.030860206112265587, + 0.02919677272439003, + 0.02889355830848217, + 0.02860802225768566, + 0.02832530438899994, + 0.027855750173330307, + 0.027308572083711624, + 0.026772143319249153, + 0.025916224345564842, + 0.02453462965786457, + 0.02322668582201004, + 0.010177450254559517, + 0.010466793552041054, + 0.010658490471541882, + 0.010791818611323833, + 0.010926812887191772, + 0.011473816819489002, + 0.01209569163620472, + 0.012706690467894077, + 0.013098204508423805, + 0.013501781970262527, + 0.01376961637288332, + 0.013813678175210953, + 0.013857883401215076, + 0.014228437095880508, + 0.014820979908108711, + 0.015438196249306202, + 0.01605895720422268, + 0.016699742525815964, + 0.01736261509358883, + 0.01781168021261692, + 0.018272358924150467, + 0.018788255751132965, + 0.01950964331626892, + 0.02025873027741909, + 0.020983237773180008, + 0.021631157025694847, + 0.022299084812402725, + 0.023040438070893288, + 0.02386273443698883, + 0.024714374914765358, + 0.02553875930607319, + 0.026354201138019562, + 0.027195682749152184, + 0.02792940102517605, + 0.02863222174346447, + 0.02935272641479969, + 0.030170787125825882, + 0.03102889470756054, + 0.03191141039133072, + 0.03364105522632599, + 0.03555751219391823, + 0.03758314996957779, + 0.03919702023267746, + 0.040861066430807114, + 0.0425867959856987, + 0.043592244386672974, + 0.044621434062719345, + 0.04566919803619385, + 0.04660186916589737, + 0.047553591430187225, + 0.04852131009101868, + 0.04944498836994171, + 0.05038624629378319, + 0.05148134008049965, + 0.05548141151666641, + 0.05979228392243385, + 0.06427239626646042, + 0.0625884160399437, + 0.060948558151721954, + 0.059351664036512375, + 0.06037599965929985, + 0.06145466864109039, + 0.06255260854959488, + 0.06358285248279572, + 0.06462344527244568, + 0.0656810775399208, + 0.06510677933692932, + 0.06426936388015747, + 0.06344272941350937, + 0.06276699900627136, + 0.06214075908064842, + 0.061520762741565704, + 0.061272844672203064, + 0.06121555715799332, + 0.06115832179784775, + 0.060657013207674026, + 0.05977687984704971, + 0.05890952795743942, + 0.05765892565250397, + 0.055834539234638214, + 0.054067883640527725, + 0.05201265215873718, + 0.048937711864709854, + 0.046044569462537766, + 0.04336213693022728, + 0.041542839258909225, + 0.039799872785806656, + 0.038130033761262894, + 0.03673267737030983, + 0.03541995584964752, + 0.034154146909713745, + 0.03303317353129387, + 0.03200344368815422, + 0.03100580908358097, + 0.03030906617641449, + 0.030016977339982986, + 0.02972770296037197, + 0.029312290251255035, + 0.02822326123714447, + 0.02717469446361065, + 0.026165081188082695, + 0.025106875225901604, + 0.024080907925963402, + 0.02309686690568924, + 0.022435076534748077, + 0.021977761760354042, + 0.021529771387577057, + 0.020931951701641083, + 0.01998184062540531, + 0.019074853509664536, + 0.01820903643965721, + 0.017806099727749825, + 0.01742609404027462, + 0.01033973041921854, + 0.010693195275962353, + 0.010915720835328102, + 0.010898036882281303, + 0.010880381800234318, + 0.011145025491714478, + 0.011584271676838398, + 0.012040829285979271, + 0.012285609729588032, + 0.012506409548223019, + 0.01277091447263956, + 0.013326927088201046, + 0.013907146640121937, + 0.014427484013140202, + 0.014802224934101105, + 0.015186699107289314, + 0.015690095722675323, + 0.016302097588777542, + 0.016937969252467155, + 0.01746985875070095, + 0.01797240413725376, + 0.018489405512809753, + 0.019235946238040924, + 0.02003340609371662, + 0.020848264917731285, + 0.021490812301635742, + 0.022153163328766823, + 0.022994307801127434, + 0.024477405473589897, + 0.026056163012981415, + 0.027346111834049225, + 0.027922872453927994, + 0.02851179614663124, + 0.029060566797852516, + 0.029554573819041252, + 0.03005697764456272, + 0.030706647783517838, + 0.031489983201026917, + 0.032293304800987244, + 0.03359675779938698, + 0.0352620892226696, + 0.037009965628385544, + 0.038258347660303116, + 0.039267443120479584, + 0.04030315577983856, + 0.04163636639714241, + 0.04312044754624367, + 0.044657424092292786, + 0.04703379049897194, + 0.04981332644820213, + 0.05275712534785271, + 0.05462108552455902, + 0.05615050345659256, + 0.05772274360060692, + 0.05993432551622391, + 0.062432531267404556, + 0.06503486633300781, + 0.06686046719551086, + 0.0684063509106636, + 0.06998796761035919, + 0.07143478095531464, + 0.07283343374729156, + 0.07425946742296219, + 0.07465983927249908, + 0.07445593923330307, + 0.07425259053707123, + 0.07460665702819824, + 0.07540777325630188, + 0.07621748745441437, + 0.07527483999729156, + 0.07240122556686401, + 0.06963731348514557, + 0.06729090958833694, + 0.06557124108076096, + 0.06389552354812622, + 0.06181133911013603, + 0.058350954204797745, + 0.055084291845560074, + 0.05210307613015175, + 0.05034690350294113, + 0.04864991828799248, + 0.047010134905576706, + 0.043886955827474594, + 0.040851905941963196, + 0.03802674263715744, + 0.03619954362511635, + 0.034730494022369385, + 0.033321063965559006, + 0.032073456794023514, + 0.03095749206840992, + 0.029880357906222343, + 0.028835587203502655, + 0.02781718224287033, + 0.026834743097424507, + 0.025821415707468987, + 0.024234389886260033, + 0.022744903340935707, + 0.021346963942050934, + 0.020336920395493507, + 0.01943010836839676, + 0.018563730642199516, + 0.01796445995569229, + 0.01755419932305813, + 0.017153307795524597, + 0.016799014061689377, + 0.016547145321965218, + 0.01629905216395855, + 0.016054680570960045, + 0.015560160391032696, + 0.015073602087795734, + 0.014602257870137691, + 0.014342697337269783, + 0.01419573463499546, + 0.006174704525619745, + 0.006390692200511694, + 0.0066140093840658665, + 0.006843938957899809, + 0.007081862073391676, + 0.007260579615831375, + 0.007353113032877445, + 0.007446825969964266, + 0.007679457310587168, + 0.007986769080162048, + 0.008306378498673439, + 0.008754185400903225, + 0.009237302467226982, + 0.0097019849345088, + 0.00989489909261465, + 0.010091650299727917, + 0.010351181030273438, + 0.010735347867012024, + 0.011133773252367973, + 0.011498437263071537, + 0.011830560863018036, + 0.012172277085483074, + 0.012633056379854679, + 0.01315981987863779, + 0.013708548620343208, + 0.014236410148441792, + 0.014777092263102531, + 0.015338308177888393, + 0.015972603112459183, + 0.016633203253149986, + 0.01735585182905197, + 0.01837013103067875, + 0.019443688914179802, + 0.02050991915166378, + 0.02139081247150898, + 0.02230953611433506, + 0.02323019504547119, + 0.02410724386572838, + 0.025017408654093742, + 0.025999244302511215, + 0.027078168466687202, + 0.028201865032315254, + 0.02950429543852806, + 0.031031295657157898, + 0.032637327909469604, + 0.034892745316028595, + 0.03791837394237518, + 0.04120635986328125, + 0.04381437599658966, + 0.04568234831094742, + 0.0476299524307251, + 0.051047392189502716, + 0.05603424459695816, + 0.061508264392614365, + 0.06718458980321884, + 0.07306089997291565, + 0.07945117354393005, + 0.08573689311742783, + 0.09181689471006393, + 0.09832806140184402, + 0.10321849584579468, + 0.10584933310747147, + 0.10854723304510117, + 0.1112971305847168, + 0.11409112066030502, + 0.11695526540279388, + 0.11832740902900696, + 0.1165049821138382, + 0.11471061408519745, + 0.11206705868244171, + 0.10669771581888199, + 0.10158562660217285, + 0.09620942920446396, + 0.08769477158784866, + 0.07993367314338684, + 0.07285943627357483, + 0.06517353653907776, + 0.058290205895900726, + 0.05213386192917824, + 0.04634261131286621, + 0.041148848831653595, + 0.03653717413544655, + 0.033287011086940765, + 0.030690714716911316, + 0.028296925127506256, + 0.0259728841483593, + 0.02373317815363407, + 0.021686609834432602, + 0.019926507025957108, + 0.01854599453508854, + 0.017261125147342682, + 0.016080794855952263, + 0.015141184441745281, + 0.014256478287279606, + 0.013423464260995388, + 0.012839209288358688, + 0.012315148487687111, + 0.011812477372586727, + 0.011332976631820202, + 0.01087468396872282, + 0.010434924624860287, + 0.010044748894870281, + 0.009734250605106354, + 0.009433351457118988, + 0.009141321294009686, + 0.008844861760735512, + 0.008558018133044243, + 0.008280476555228233, + 0.007879512384533882, + 0.00744967395439744, + 0.007043283898383379, + 0.0067640249617397785, + 0.006655002478510141, + 0.0017257553990930319, + 0.0017781475326046348, + 0.0018328202422708273, + 0.0019316266989335418, + 0.0020357598550617695, + 0.002120755612850189, + 0.0021450351923704147, + 0.0021695925388485193, + 0.0022260737605392933, + 0.0023129424080252647, + 0.0024032010696828365, + 0.00249627442099154, + 0.0025927291717380285, + 0.002692910609766841, + 0.002818057779222727, + 0.002949338871985674, + 0.0030856961384415627, + 0.0032236985862255096, + 0.0033678726758807898, + 0.003527809865772724, + 0.0037115425802767277, + 0.003904844168573618, + 0.004089599009603262, + 0.004267109092324972, + 0.004452324006706476, + 0.0047541288658976555, + 0.0051258946768939495, + 0.00552673265337944, + 0.005767154973000288, + 0.00598173076286912, + 0.00620429078117013, + 0.006650315597653389, + 0.007136284373700619, + 0.007649767212569714, + 0.00809494499117136, + 0.008566029369831085, + 0.009049533866345882, + 0.009481077082455158, + 0.009933199733495712, + 0.010536426678299904, + 0.01162139791995287, + 0.012818091548979282, + 0.013934771530330181, + 0.014642550610005856, + 0.015386281535029411, + 0.016419950872659683, + 0.01805655099451542, + 0.019856270402669907, + 0.02190786972641945, + 0.024311088025569916, + 0.026977933943271637, + 0.03055770881474018, + 0.03582458198070526, + 0.04199923947453499, + 0.04926266893744469, + 0.05783238634467125, + 0.067892886698246, + 0.08004852384328842, + 0.09517882764339447, + 0.11316897720098495, + 0.13282594084739685, + 0.15116804838180542, + 0.17204302549362183, + 0.19216187298297882, + 0.20201142132282257, + 0.21236583590507507, + 0.22172954678535461, + 0.22329625487327576, + 0.22487401962280273, + 0.22423861920833588, + 0.19388316571712494, + 0.16763699054718018, + 0.14494375884532928, + 0.11135386675596237, + 0.08504874259233475, + 0.06495767086744308, + 0.05074411630630493, + 0.03983297571539879, + 0.03126797825098038, + 0.025141455233097076, + 0.020449265837669373, + 0.01663278602063656, + 0.014141778461635113, + 0.012544176541268826, + 0.011127055622637272, + 0.009866039268672466, + 0.008740708231925964, + 0.007743733935058117, + 0.006877938285470009, + 0.006215692963451147, + 0.005617212504148483, + 0.005076357163488865, + 0.004673769231885672, + 0.004311113152652979, + 0.0039765965193510056, + 0.0036842927802354097, + 0.0034208372235298157, + 0.003176221391186118, + 0.0029955310747027397, + 0.0028874254785478115, + 0.0027832211926579475, + 0.002672808011993766, + 0.0025105371605604887, + 0.002358117839321494, + 0.002214952604845166, + 0.0021499774884432554, + 0.002098856493830681, + 0.0020489508751779795, + 0.0019825526978820562, + 0.0019039431354030967, + 0.0018284505931660533, + 0.0017586138565093279, + 0.0017009737202897668, + 0.0036477423273026943, + 0.0037422841414809227, + 0.0038392760325223207, + 0.003993092570453882, + 0.004157463554292917, + 0.004324059933423996, + 0.004477678798139095, + 0.004636755213141441, + 0.004828637931495905, + 0.005064251832664013, + 0.005311361979693174, + 0.005570911802351475, + 0.005843335296958685, + 0.006129080895334482, + 0.006413799710571766, + 0.0067099155858159065, + 0.007016178220510483, + 0.0073027159087359905, + 0.0076009551994502544, + 0.00792719330638647, + 0.008308891206979752, + 0.008708967827260494, + 0.009169261902570724, + 0.00970546342432499, + 0.010273018851876259, + 0.01076305191963911, + 0.011203461326658726, + 0.01166189182549715, + 0.01234397105872631, + 0.013138658367097378, + 0.013984506949782372, + 0.014843969605863094, + 0.015750017017126083, + 0.016711369156837463, + 0.01775006391108036, + 0.01885370723903179, + 0.02001168578863144, + 0.021044624969363213, + 0.022130878642201424, + 0.023253515362739563, + 0.02431202121078968, + 0.025418713688850403, + 0.026722390204668045, + 0.028705494478344917, + 0.030835764482617378, + 0.032954707741737366, + 0.03466501086950302, + 0.03646408021450043, + 0.038739584386348724, + 0.04228590801358223, + 0.0461568683385849, + 0.05052374675869942, + 0.055711835622787476, + 0.061432670801877975, + 0.06807231158018112, + 0.07644712179899216, + 0.08585227280855179, + 0.09645470976829529, + 0.1085091084241867, + 0.12206999957561493, + 0.13661405444145203, + 0.1496955305337906, + 0.16402962803840637, + 0.1772060990333557, + 0.17508234083652496, + 0.1729840189218521, + 0.16974632441997528, + 0.14944490790367126, + 0.13157150149345398, + 0.11583573371171951, + 0.10433342307806015, + 0.09405279159545898, + 0.08478518575429916, + 0.07635360211133957, + 0.06874842196702957, + 0.061900753527879715, + 0.05375315994024277, + 0.046030592173337936, + 0.03941750153899193, + 0.03418147191405296, + 0.02991882711648941, + 0.02618776261806488, + 0.023054026067256927, + 0.020464766770601273, + 0.0181663129478693, + 0.016186755150556564, + 0.014610662125051022, + 0.013188031502068043, + 0.011905605904757977, + 0.010809808038175106, + 0.009814868681132793, + 0.008911503478884697, + 0.008243592455983162, + 0.007660336326807737, + 0.007118347100913525, + 0.006678062956780195, + 0.006310740020126104, + 0.005963621661067009, + 0.005630744621157646, + 0.005306342151015997, + 0.005000629927963018, + 0.004715597722679377, + 0.004521585535258055, + 0.004335555713623762, + 0.0041571795009076595, + 0.004003336187452078, + 0.0038608682807534933, + 0.003723470028489828, + 0.003587906016036868, + 0.003453441895544529, + 0.0033240169286727905, + 0.003202923107892275, + 0.0031151985749602318, + 0.008041011169552803, + 0.008407164365053177, + 0.008789991028606892, + 0.009099301882088184, + 0.009408965706825256, + 0.009713608771562576, + 0.009946472011506557, + 0.010184917598962784, + 0.010535542853176594, + 0.011056594550609589, + 0.01160341501235962, + 0.01244963426142931, + 0.013519681990146637, + 0.014681701548397541, + 0.01571447029709816, + 0.016782062128186226, + 0.017863180488348007, + 0.018174298107624054, + 0.018490834161639214, + 0.01888873614370823, + 0.01952347159385681, + 0.020179536193609238, + 0.021209442988038063, + 0.022800177335739136, + 0.02451021783053875, + 0.025509854778647423, + 0.025937993079423904, + 0.02637331560254097, + 0.027538511902093887, + 0.02905404195189476, + 0.0306529738008976, + 0.0321788564324379, + 0.033749282360076904, + 0.03539635241031647, + 0.03715766221284866, + 0.03900850564241409, + 0.04093049466609955, + 0.04241941124200821, + 0.043962493538856506, + 0.04533041641116142, + 0.04492584988474846, + 0.044524896889925, + 0.04452389106154442, + 0.046490367501974106, + 0.04854369908571243, + 0.05055813491344452, + 0.05215831845998764, + 0.05380914732813835, + 0.055386219173669815, + 0.05659256502985954, + 0.05782518908381462, + 0.059788353741168976, + 0.06413020938634872, + 0.06878738105297089, + 0.07293837517499924, + 0.07448563724756241, + 0.07606571912765503, + 0.07776479423046112, + 0.07983546704053879, + 0.08196128904819489, + 0.0841476172208786, + 0.08641266822814941, + 0.08873869478702545, + 0.09093835204839706, + 0.09153787046670914, + 0.09214134514331818, + 0.09258152544498444, + 0.08693210035562515, + 0.08162741363048553, + 0.07664641737937927, + 0.07312516123056412, + 0.06984847784042358, + 0.06671861559152603, + 0.0628545954823494, + 0.059032637625932693, + 0.05544307455420494, + 0.052010584622621536, + 0.048764560371637344, + 0.04572112485766411, + 0.041653502732515335, + 0.03702980652451515, + 0.03291935846209526, + 0.029621968045830727, + 0.027200408279895782, + 0.024976810440421104, + 0.02296234481036663, + 0.021217387169599533, + 0.019605033099651337, + 0.018115203827619553, + 0.01694331131875515, + 0.01584930345416069, + 0.014825933612883091, + 0.014073368161916733, + 0.013417661190032959, + 0.012792506255209446, + 0.012060321867465973, + 0.011258396320044994, + 0.01050979271531105, + 0.009923340752720833, + 0.009653287939727306, + 0.009390585124492645, + 0.009134314022958279, + 0.008560503832995892, + 0.008022738620638847, + 0.007518756669014692, + 0.007331301923841238, + 0.007265515625476837, + 0.0072003197856247425, + 0.007060709875077009, + 0.006814112421125174, + 0.006576126907020807, + 0.0063504911959171295, + 0.00618609506636858, + 0.010783732868731022, + 0.011214729398488998, + 0.011662953533232212, + 0.012197041884064674, + 0.012761091813445091, + 0.013319302350282669, + 0.013763774186372757, + 0.014223078265786171, + 0.014872600324451923, + 0.015784863382577896, + 0.01675308309495449, + 0.01749635674059391, + 0.018132636323571205, + 0.018792053684592247, + 0.019800208508968353, + 0.020902739837765694, + 0.022089537233114243, + 0.023566527292132378, + 0.025142276659607887, + 0.02656881883740425, + 0.027413832023739815, + 0.028285721316933632, + 0.02935023233294487, + 0.030659733340144157, + 0.03202766180038452, + 0.03328689932823181, + 0.03448417782783508, + 0.035724516957998276, + 0.03714068979024887, + 0.03865833953022957, + 0.04023800417780876, + 0.04320158436894417, + 0.046591151505708694, + 0.05024665221571922, + 0.05296151712536812, + 0.05579815432429314, + 0.0585363395512104, + 0.05809401348233223, + 0.057655032724142075, + 0.057484570890665054, + 0.05889176204800606, + 0.06033340096473694, + 0.06159541755914688, + 0.06203093007206917, + 0.062469519674777985, + 0.0628853365778923, + 0.06322340667247772, + 0.06356329470872879, + 0.06382414698600769, + 0.063865527510643, + 0.06390693783760071, + 0.0640755221247673, + 0.06457977741956711, + 0.06508800387382507, + 0.06551022082567215, + 0.06568700820207596, + 0.06586427986621857, + 0.06598225235939026, + 0.0659119188785553, + 0.0658416599035263, + 0.06584055721759796, + 0.06612103432416916, + 0.06640270352363586, + 0.06639527529478073, + 0.06458791345357895, + 0.06282974779605865, + 0.06109343469142914, + 0.05900529772043228, + 0.05698852986097336, + 0.055040691047906876, + 0.05280733481049538, + 0.05065210908651352, + 0.048584844917058945, + 0.04621542617678642, + 0.04389786347746849, + 0.041696518659591675, + 0.0393730029463768, + 0.0370946004986763, + 0.034948043525218964, + 0.03275906667113304, + 0.03059176541864872, + 0.028567852452397346, + 0.0267372727394104, + 0.025104744359850883, + 0.02357189729809761, + 0.02214505895972252, + 0.020844776183366776, + 0.01962083950638771, + 0.0184780340641737, + 0.017760194838047028, + 0.017070241272449493, + 0.016407093033194542, + 0.015891175717115402, + 0.015420173294842243, + 0.014963132329285145, + 0.014296872541308403, + 0.013500100933015347, + 0.012747731991112232, + 0.012027998454868793, + 0.011329544708132744, + 0.010671649128198624, + 0.010065076872706413, + 0.009815615601837635, + 0.009572336450219154, + 0.009335087612271309, + 0.009083330631256104, + 0.008831585757434368, + 0.008586819283664227, + 0.008427444845438004, + 0.008372725918889046, + 0.008318360894918442, + 0.00822113174945116, + 0.007767238654196262, + 0.011525587178766727, + 0.012134437449276447, + 0.012772001326084137, + 0.013230527751147747, + 0.013705515302717686, + 0.014265979640185833, + 0.015032113529741764, + 0.015839390456676483, + 0.016773737967014313, + 0.01784147508442402, + 0.018977178260684013, + 0.019739197567105293, + 0.020392822101712227, + 0.021068090572953224, + 0.02214660681784153, + 0.023286137729883194, + 0.024457618594169617, + 0.025568272918462753, + 0.026729362085461617, + 0.028069594874978065, + 0.029697978869080544, + 0.03142082691192627, + 0.03323071077466011, + 0.03513360768556595, + 0.0371454656124115, + 0.038365695625543594, + 0.03923897072672844, + 0.04013211652636528, + 0.04186737537384033, + 0.04383813217282295, + 0.04590165242552757, + 0.049582961946725845, + 0.05361558124423027, + 0.057699162513017654, + 0.05852419137954712, + 0.05936101824045181, + 0.06013605371117592, + 0.06054694205522537, + 0.060960639268159866, + 0.061705928295850754, + 0.06352261453866959, + 0.06539279967546463, + 0.06685596704483032, + 0.06725577265024185, + 0.06765797734260559, + 0.06826497614383698, + 0.06927487254142761, + 0.07029969990253448, + 0.07089494168758392, + 0.07072241604328156, + 0.07055030018091202, + 0.06962748616933823, + 0.06749051809310913, + 0.06541913002729416, + 0.06397803872823715, + 0.06354613602161407, + 0.0631171464920044, + 0.0629027858376503, + 0.06310267001390457, + 0.06330318003892899, + 0.06260934472084045, + 0.05986994504928589, + 0.057250406593084335, + 0.055131975561380386, + 0.054312460124492645, + 0.053505122661590576, + 0.05241905897855759, + 0.049876920878887177, + 0.04745807126164436, + 0.045192230492830276, + 0.043528955429792404, + 0.04192689061164856, + 0.04038379341363907, + 0.03893885016441345, + 0.03754758462309837, + 0.03620602563023567, + 0.03411316126585007, + 0.031981900334358215, + 0.02998379059135914, + 0.02837366797029972, + 0.026970088481903076, + 0.025635940954089165, + 0.024166066199541092, + 0.0226002037525177, + 0.021135803312063217, + 0.01997763104736805, + 0.019297722727060318, + 0.018640954047441483, + 0.017930831760168076, + 0.016759619116783142, + 0.01566491089761257, + 0.01464170403778553, + 0.014349699951708317, + 0.01413023378700018, + 0.01391412504017353, + 0.013310736045241356, + 0.01255533006042242, + 0.01184279564768076, + 0.011381757445633411, + 0.011228335089981556, + 0.011076979339122772, + 0.010869402438402176, + 0.010331775061786175, + 0.009820740669965744, + 0.009334982372820377, + 0.009059821255505085, + 0.008824614807963371, + 0.008595515042543411, + 0.008380299434065819, + 0.008177030831575394, + 0.007978690788149834, + 0.00782312173396349, + 0.007810183335095644, + 0.013524269685149193, + 0.014292539097368717, + 0.014999228529632092, + 0.015188791789114475, + 0.01538075041025877, + 0.015872351825237274, + 0.01679515466094017, + 0.017771607264876366, + 0.01891051046550274, + 0.020175287500023842, + 0.02152465656399727, + 0.02278444729745388, + 0.024100689217448235, + 0.02528955228626728, + 0.025223297998309135, + 0.02515721693634987, + 0.025596335530281067, + 0.02706819586455822, + 0.02862469293177128, + 0.03013184480369091, + 0.031588710844516754, + 0.033116016536951065, + 0.03455197066068649, + 0.035977061837911606, + 0.03746093437075615, + 0.03935684263706207, + 0.04141002520918846, + 0.04357031360268593, + 0.045393526554107666, + 0.04729238897562027, + 0.0491371676325798, + 0.050076548010110855, + 0.051033880561590195, + 0.0522659569978714, + 0.05440988019108772, + 0.05664174631237984, + 0.058611638844013214, + 0.05989127978682518, + 0.06119885668158531, + 0.0625486895442009, + 0.06394940614700317, + 0.0653814896941185, + 0.06628187745809555, + 0.06652424484491348, + 0.06676751375198364, + 0.06724172085523605, + 0.06795141100883484, + 0.06866858154535294, + 0.06971019506454468, + 0.07105853408575058, + 0.07243295758962631, + 0.07122880220413208, + 0.06789359450340271, + 0.06471455842256546, + 0.06438512355089188, + 0.06656476110219955, + 0.06881818920373917, + 0.06718579679727554, + 0.061976946890354156, + 0.057171937078237534, + 0.05370016768574715, + 0.05151587724685669, + 0.04942043125629425, + 0.04798055812716484, + 0.04741908982396126, + 0.046864189207553864, + 0.04580426216125488, + 0.04375065490603447, + 0.04178911820054054, + 0.040031496435403824, + 0.03871762752532959, + 0.03744688257575035, + 0.03622298315167427, + 0.03507520258426666, + 0.03396378830075264, + 0.032887592911720276, + 0.03151940926909447, + 0.030205823481082916, + 0.028946980834007263, + 0.02741532400250435, + 0.025909196585416794, + 0.024485813453793526, + 0.02379963919520378, + 0.023436831310391426, + 0.023079555481672287, + 0.02229136973619461, + 0.021118002012372017, + 0.020006397739052773, + 0.0190381221473217, + 0.018305454403162003, + 0.017600981518626213, + 0.01692420244216919, + 0.016279613599181175, + 0.015659574419260025, + 0.015063152648508549, + 0.014514545910060406, + 0.013990278355777264, + 0.013484947383403778, + 0.013124873861670494, + 0.012859820388257504, + 0.012600119225680828, + 0.012324097566306591, + 0.012009614147245884, + 0.011703155003488064, + 0.01140084583312273, + 0.010991535149514675, + 0.010596919804811478, + 0.01021647173911333, + 0.0099606579169631, + 0.009753524325788021, + 0.009550697170197964, + 0.009432378225028515, + 0.009439601562917233, + 0.014196738600730896, + 0.014748798683285713, + 0.015433425083756447, + 0.01635020598769188, + 0.017321446910500526, + 0.018084848299622536, + 0.018725667148828506, + 0.019389191642403603, + 0.019980208948254585, + 0.020576925948262215, + 0.021230727434158325, + 0.022189296782016754, + 0.023191146552562714, + 0.024165451526641846, + 0.025038376450538635, + 0.025942835956811905, + 0.02723114751279354, + 0.02888612635433674, + 0.030641689896583557, + 0.03184754028916359, + 0.03286639600992203, + 0.033917851746082306, + 0.03593342378735542, + 0.03816123679280281, + 0.04038669914007187, + 0.040902767330408096, + 0.0414254292845726, + 0.04215535521507263, + 0.04365181177854538, + 0.045201387256383896, + 0.04683675616979599, + 0.04859306663274765, + 0.05041523650288582, + 0.05202891305088997, + 0.053347304463386536, + 0.05469910427927971, + 0.05672984942793846, + 0.05940395966172218, + 0.06220412254333496, + 0.06326337903738022, + 0.06320086866617203, + 0.06313841789960861, + 0.06435646861791611, + 0.06622005254030228, + 0.06813760101795197, + 0.06897079199552536, + 0.06937973946332932, + 0.06979110836982727, + 0.06930220127105713, + 0.06852243840694427, + 0.067751444876194, + 0.0668267160654068, + 0.06586453318595886, + 0.06491619348526001, + 0.06351002305746078, + 0.061985377222299576, + 0.06049733608961105, + 0.05830666050314903, + 0.055936411023139954, + 0.053662512451410294, + 0.05164309963583946, + 0.0497695691883564, + 0.04796401038765907, + 0.04632394760847092, + 0.04479596018791199, + 0.04331837594509125, + 0.041783832013607025, + 0.040223218500614166, + 0.03872089833021164, + 0.03783077374100685, + 0.03759313374757767, + 0.037356987595558167, + 0.03656233102083206, + 0.03481624275445938, + 0.03315354138612747, + 0.03176460787653923, + 0.031068146228790283, + 0.03038695827126503, + 0.02965426631271839, + 0.02824591100215912, + 0.02690444141626358, + 0.025626685470342636, + 0.02509501576423645, + 0.02463206835091114, + 0.024177657440304756, + 0.023316124454140663, + 0.022347282618284225, + 0.021418696269392967, + 0.020605551078915596, + 0.019885661080479622, + 0.019190926104784012, + 0.018644209951162338, + 0.018363244831562042, + 0.0180865116417408, + 0.017789844423532486, + 0.017266640439629555, + 0.01675882562994957, + 0.01626594550907612, + 0.01567237637937069, + 0.015079360455274582, + 0.01450878195464611, + 0.014032864011824131, + 0.01362642738968134, + 0.013231762684881687, + 0.012930053286254406, + 0.012843366712331772, + 0.012757261283695698, + 0.012671733275055885, + 0.012322981841862202, + 0.011976266279816628, + 0.011639304459095001, + 0.011344517581164837, + 0.011074826121330261, + 0.013534651137888432, + 0.014179023914039135, + 0.014940258115530014, + 0.015795132145285606, + 0.016698921099305153, + 0.017137449234724045, + 0.017531121149659157, + 0.017949409782886505, + 0.018464135006070137, + 0.018993617966771126, + 0.019833553582429886, + 0.021193519234657288, + 0.022646738216280937, + 0.023591259494423866, + 0.024189425632357597, + 0.024802763015031815, + 0.02597782574594021, + 0.027332648634910583, + 0.0287464689463377, + 0.029425928369164467, + 0.030121445655822754, + 0.030967555940151215, + 0.032431989908218384, + 0.03396567702293396, + 0.03565419465303421, + 0.03758804872632027, + 0.03962679207324982, + 0.04161270335316658, + 0.04352220892906189, + 0.04551933333277702, + 0.04719004034996033, + 0.04865837097167969, + 0.05017239227890968, + 0.051760878413915634, + 0.05341004207730293, + 0.05511175096035004, + 0.057191263884305954, + 0.059420306235551834, + 0.061736226081848145, + 0.06326944380998611, + 0.0647466778755188, + 0.06625840067863464, + 0.06647469848394394, + 0.06664540618658066, + 0.06682842969894409, + 0.06804027408361435, + 0.06927409768104553, + 0.07040610909461975, + 0.06860655546188354, + 0.06685300916433334, + 0.06522727757692337, + 0.06513155996799469, + 0.06503598392009735, + 0.06484320014715195, + 0.0627237930893898, + 0.06067366525530815, + 0.05869404226541519, + 0.05690896883606911, + 0.05517818406224251, + 0.05350004509091377, + 0.05166330933570862, + 0.04988687485456467, + 0.0481715202331543, + 0.046397194266319275, + 0.04467974603176117, + 0.04302587732672691, + 0.04186776652932167, + 0.040811628103256226, + 0.03978212922811508, + 0.038524381816387177, + 0.03723182529211044, + 0.0359826423227787, + 0.034884557127952576, + 0.03387495502829552, + 0.032894570380449295, + 0.03181290626525879, + 0.03065747767686844, + 0.029544012621045113, + 0.028677411377429962, + 0.028152355924248695, + 0.02763691544532776, + 0.027088044211268425, + 0.026409344747662544, + 0.025747649371623993, + 0.025082184001803398, + 0.02406522072851658, + 0.023089492693543434, + 0.022153323516249657, + 0.022039327770471573, + 0.022062068805098534, + 0.022084834054112434, + 0.021582668647170067, + 0.02080802246928215, + 0.020061178132891655, + 0.019482726231217384, + 0.019123360514640808, + 0.018770622089505196, + 0.018389802426099777, + 0.01783413253724575, + 0.01729525439441204, + 0.016772659495472908, + 0.016265656799077988, + 0.015773955732584, + 0.015297116711735725, + 0.014923127368092537, + 0.014616374857723713, + 0.014315927401185036, + 0.014067539013922215, + 0.01393309235572815, + 0.013799930922687054, + 0.013668042607605457, + 0.013446704484522343, + 0.0132259801030159, + 0.011777423322200775, + 0.011998406611382961, + 0.01258651353418827, + 0.013221362605690956, + 0.013837155885994434, + 0.01430056057870388, + 0.014779486693441868, + 0.015305543318390846, + 0.015885004773736, + 0.016486404463648796, + 0.01744496263563633, + 0.018597401678562164, + 0.019825972616672516, + 0.020538369193673134, + 0.021241748705506325, + 0.022049913182854652, + 0.023350941017270088, + 0.02472873404622078, + 0.026027215644717216, + 0.027079947292804718, + 0.028175264596939087, + 0.02896193601191044, + 0.029446298256516457, + 0.02993876300752163, + 0.031215639784932137, + 0.03292354568839073, + 0.0347248911857605, + 0.03710886836051941, + 0.03976203873753548, + 0.042604900896549225, + 0.0435287170112133, + 0.04438642039895058, + 0.04534277319908142, + 0.047380637377500534, + 0.04951008781790733, + 0.051962919533252716, + 0.055714935064315796, + 0.059737857431173325, + 0.0630330741405487, + 0.0634017214179039, + 0.0637725293636322, + 0.06503518670797348, + 0.0683421865105629, + 0.07181733846664429, + 0.07414300739765167, + 0.07418996095657349, + 0.07423695176839828, + 0.07386228442192078, + 0.07284533977508545, + 0.07184238731861115, + 0.0706029161810875, + 0.06902739405632019, + 0.06748702377080917, + 0.06565466523170471, + 0.06340600550174713, + 0.061234354972839355, + 0.059645578265190125, + 0.058901816606521606, + 0.05816732719540596, + 0.05645906925201416, + 0.05304999276995659, + 0.04984676092863083, + 0.04732191190123558, + 0.04605512693524361, + 0.04482224956154823, + 0.04351750761270523, + 0.04189567640423775, + 0.04033428430557251, + 0.03904527798295021, + 0.03917253017425537, + 0.03930019959807396, + 0.03938136622309685, + 0.03783508390188217, + 0.03634951636195183, + 0.0349222794175148, + 0.033295001834630966, + 0.031717754900455475, + 0.030215218663215637, + 0.02973143197596073, + 0.029551159590482712, + 0.02937197871506214, + 0.02874092385172844, + 0.027836937457323074, + 0.02696138434112072, + 0.026232779026031494, + 0.025680122897028923, + 0.025139112025499344, + 0.024721428751945496, + 0.024675937369465828, + 0.024630527943372726, + 0.024555210024118423, + 0.023112880066037178, + 0.021755270659923553, + 0.020477404817938805, + 0.020251527428627014, + 0.02029275894165039, + 0.020334074273705482, + 0.019773291423916817, + 0.018745597451925278, + 0.017771314829587936, + 0.017022857442498207, + 0.01675822213292122, + 0.016497701406478882, + 0.016241230070590973, + 0.01597275584936142, + 0.015708545222878456, + 0.015448703430593014, + 0.014814105816185474, + 0.014041339978575706, + 0.01330888643860817, + 0.012722189538180828, + 0.01234459225088358, + 0.011978203430771828, + 0.011249701492488384, + 0.012100821360945702, + 0.012026656419038773, + 0.011952947825193405, + 0.012442411854863167, + 0.013343232683837414, + 0.014309272170066833, + 0.014847325161099434, + 0.015327297151088715, + 0.01582597754895687, + 0.016368065029382706, + 0.016928721219301224, + 0.017545565962791443, + 0.018261278048157692, + 0.019006185233592987, + 0.019893044605851173, + 0.02091897651553154, + 0.02199782058596611, + 0.022716756910085678, + 0.023311004042625427, + 0.02392079308629036, + 0.025136776268482208, + 0.026468949392437935, + 0.027842378243803978, + 0.028951819986104965, + 0.03010547161102295, + 0.031505558639764786, + 0.03367751091718674, + 0.035999197512865067, + 0.0380927249789238, + 0.03959645330905914, + 0.04115954414010048, + 0.04273473843932152, + 0.04431404545903206, + 0.045951709151268005, + 0.04782132804393768, + 0.04989823326468468, + 0.05206533521413803, + 0.053747329860925674, + 0.055177535861730576, + 0.056645799428224564, + 0.05981246754527092, + 0.06383112818002701, + 0.06811979413032532, + 0.06902763247489929, + 0.06890634447336197, + 0.06878527253866196, + 0.06821533292531967, + 0.06754497438669205, + 0.0668812096118927, + 0.06554806232452393, + 0.06410153955221176, + 0.06268693506717682, + 0.06158430129289627, + 0.060560088604688644, + 0.059552907943725586, + 0.058748528361320496, + 0.05799908936023712, + 0.0572592057287693, + 0.05580231919884682, + 0.05417539179325104, + 0.052595894783735275, + 0.051397327333688736, + 0.0503535121679306, + 0.04933089390397072, + 0.04824298247694969, + 0.04713417962193489, + 0.04605086147785187, + 0.04551495611667633, + 0.045385681092739105, + 0.04525677114725113, + 0.04417111352086067, + 0.04204991087317467, + 0.04003056883811951, + 0.038560133427381516, + 0.03799844905734062, + 0.03744494542479515, + 0.0369081050157547, + 0.03641229122877121, + 0.03592314198613167, + 0.035419534891843796, + 0.03450082615017891, + 0.033605948090553284, + 0.032734278589487076, + 0.03174099698662758, + 0.030757464468479156, + 0.02980440855026245, + 0.028949813917279243, + 0.02815120853483677, + 0.027374636381864548, + 0.026683714240789413, + 0.02608085796236992, + 0.02549161948263645, + 0.024932635948061943, + 0.024437742307782173, + 0.023952674120664597, + 0.023477232083678246, + 0.02217937260866165, + 0.02095036953687668, + 0.019789468497037888, + 0.019235040992498398, + 0.01889313943684101, + 0.018557313829660416, + 0.01796732284128666, + 0.01709166169166565, + 0.01625867746770382, + 0.01554809045046568, + 0.01532934233546257, + 0.015113672241568565, + 0.014901035465300083, + 0.014335772022604942, + 0.013721571303904057, + 0.013133686035871506, + 0.009945155121386051, + 0.010389664210379124, + 0.010777990333735943, + 0.011185076087713242, + 0.01169463712722063, + 0.012227414175868034, + 0.012772665359079838, + 0.01331463735550642, + 0.013879608362913132, + 0.01450210902839899, + 0.015180928632616997, + 0.01589152403175831, + 0.01660536229610443, + 0.01734253577888012, + 0.018112434074282646, + 0.018846381455659866, + 0.019609741866588593, + 0.020322266966104507, + 0.020710652694106102, + 0.021106459200382233, + 0.021699031814932823, + 0.022635987028479576, + 0.023613397032022476, + 0.024585777893662453, + 0.02555658482015133, + 0.02656572312116623, + 0.02790130116045475, + 0.02943943627178669, + 0.03106236271560192, + 0.03174033761024475, + 0.032213736325502396, + 0.032694198191165924, + 0.03427020460367203, + 0.03599213808774948, + 0.037799760699272156, + 0.03967973217368126, + 0.04165320470929146, + 0.0436883345246315, + 0.04556756839156151, + 0.04752763360738754, + 0.049360401928424835, + 0.0503879077732563, + 0.05143680423498154, + 0.05233529582619667, + 0.05273044854402542, + 0.05312858894467354, + 0.05396653339266777, + 0.05593671277165413, + 0.05797881260514259, + 0.059627991169691086, + 0.06024652346968651, + 0.06087147444486618, + 0.06124970316886902, + 0.061061616986989975, + 0.0608740970492363, + 0.06072914972901344, + 0.060685623437166214, + 0.06064212694764137, + 0.06041962653398514, + 0.05969705060124397, + 0.058983124792575836, + 0.05826112627983093, + 0.05748729035258293, + 0.056723736226558685, + 0.05593924596905708, + 0.05498771369457245, + 0.05405237153172493, + 0.05312791094183922, + 0.05214636027812958, + 0.05118294805288315, + 0.05023733153939247, + 0.04920414090156555, + 0.0481882207095623, + 0.04719327390193939, + 0.04667459428310394, + 0.0462450310587883, + 0.04581942409276962, + 0.044803131371736526, + 0.0435728058218956, + 0.042376261204481125, + 0.0411641001701355, + 0.0399489626288414, + 0.038769692182540894, + 0.037845127284526825, + 0.03728915750980377, + 0.03674135357141495, + 0.0360398106276989, + 0.03470497950911522, + 0.03341958671808243, + 0.03218179941177368, + 0.031647372990846634, + 0.031129661947488785, + 0.030620422214269638, + 0.02978702075779438, + 0.02887657657265663, + 0.027993962168693542, + 0.026910634711384773, + 0.02566860429942608, + 0.024483898654580116, + 0.02359265461564064, + 0.02340822108089924, + 0.02322523482143879, + 0.02304367534816265, + 0.021384378895163536, + 0.019814975559711456, + 0.01836075261235237, + 0.01755717769265175, + 0.01703956350684166, + 0.01653720997273922, + 0.016104891896247864, + 0.01577884703874588, + 0.015459401533007622, + 0.015133289620280266, + 0.004428401589393616, + 0.004637762904167175, + 0.004835219122469425, + 0.005041081458330154, + 0.005175437778234482, + 0.00529819680377841, + 0.005414862185716629, + 0.005453872494399548, + 0.0054931640625, + 0.0056041544303298, + 0.005857920274138451, + 0.00612317631021142, + 0.006389477290213108, + 0.0066588642075657845, + 0.006939608138054609, + 0.007230836432427168, + 0.007533902768045664, + 0.007849671877920628, + 0.00824793428182602, + 0.008667717687785625, + 0.009076705202460289, + 0.00933401845395565, + 0.009598624892532825, + 0.009927832521498203, + 0.01039043627679348, + 0.010874597355723381, + 0.011361151933670044, + 0.011846404522657394, + 0.012352380901575089, + 0.012810672633349895, + 0.013240150175988674, + 0.013684025965631008, + 0.01425984874367714, + 0.014906153082847595, + 0.015581748448312283, + 0.01605973206460476, + 0.01650344952940941, + 0.016959428787231445, + 0.017911050468683243, + 0.01896689459681511, + 0.020084980875253677, + 0.021660014986991882, + 0.023368027061223984, + 0.02515285834670067, + 0.025091446936130524, + 0.025030184537172318, + 0.025048326700925827, + 0.026261555030941963, + 0.027533549815416336, + 0.028830451890826225, + 0.02975834719836712, + 0.030716106295585632, + 0.03177308663725853, + 0.033665355294942856, + 0.03567031770944595, + 0.03771970421075821, + 0.03878740593791008, + 0.03988533094525337, + 0.040994998067617416, + 0.04156311973929405, + 0.042139116674661636, + 0.042723096907138824, + 0.045040834695100784, + 0.047515932470560074, + 0.05012704059481621, + 0.05057919770479202, + 0.05082741752266884, + 0.05107685178518295, + 0.05234064534306526, + 0.05384879186749458, + 0.05540039390325546, + 0.05781685560941696, + 0.06065940856933594, + 0.06364171206951141, + 0.06503135710954666, + 0.06533893942832947, + 0.06564796715974808, + 0.06643463671207428, + 0.0677720233798027, + 0.06913633644580841, + 0.07060083001852036, + 0.07225574553012848, + 0.07394947111606598, + 0.07537688314914703, + 0.07502680271863937, + 0.07467834651470184, + 0.07433151453733444, + 0.0736435055732727, + 0.0729459822177887, + 0.07225506007671356, + 0.07232392579317093, + 0.07265032082796097, + 0.0729781985282898, + 0.0716632753610611, + 0.06891536712646484, + 0.06627282500267029, + 0.0637257993221283, + 0.06126198545098305, + 0.05889342725276947, + 0.05659610033035278, + 0.0528867207467556, + 0.04942045360803604, + 0.04618137329816818, + 0.04353003203868866, + 0.04116170108318329, + 0.038922227919101715, + 0.03695541247725487, + 0.035277560353279114, + 0.03367588669061661, + 0.03208308294415474, + 0.030092280358076096, + 0.028225010260939598, + 0.026473606005311012, + 0.00665531400591135, + 0.006796049419790506, + 0.007145114708691835, + 0.007512109354138374, + 0.00783782172948122, + 0.008085577748715878, + 0.008341166190803051, + 0.008496308699250221, + 0.008597781881690025, + 0.008700466714799404, + 0.009055973030626774, + 0.009455448016524315, + 0.009829194284975529, + 0.009909736923873425, + 0.009990940801799297, + 0.010185766033828259, + 0.010616336949169636, + 0.011065110564231873, + 0.011558955535292625, + 0.012099124491214752, + 0.012664534151554108, + 0.013113901950418949, + 0.0135187404230237, + 0.013936074450612068, + 0.014493746683001518, + 0.01509365439414978, + 0.01571568287909031, + 0.016193613409996033, + 0.016686080023646355, + 0.017187245190143585, + 0.017665838822722435, + 0.018157757818698883, + 0.018814759328961372, + 0.019947880879044533, + 0.02114924229681492, + 0.022308005020022392, + 0.023314565420150757, + 0.02436654269695282, + 0.025330638512969017, + 0.026154594495892525, + 0.027005348354578018, + 0.02782640978693962, + 0.02861451357603073, + 0.029424937441945076, + 0.031072275713086128, + 0.0335235521197319, + 0.03616820648312569, + 0.03706447780132294, + 0.036619700491428375, + 0.03618025407195091, + 0.03713369369506836, + 0.03909355401992798, + 0.04115685075521469, + 0.042202651500701904, + 0.04251512140035629, + 0.042829904705286026, + 0.04410738870501518, + 0.04615543782711029, + 0.04829858988523483, + 0.04919949546456337, + 0.048996809870004654, + 0.048794958740472794, + 0.04946361109614372, + 0.05107370764017105, + 0.05273621156811714, + 0.053896550089120865, + 0.054308392107486725, + 0.054723381996154785, + 0.05508461222052574, + 0.05533367395401001, + 0.05558386445045471, + 0.05610887333750725, + 0.057582758367061615, + 0.0590953528881073, + 0.060503244400024414, + 0.06071135401725769, + 0.060920171439647675, + 0.06112971156835556, + 0.061262983828783035, + 0.06139383465051651, + 0.06152496486902237, + 0.061701592057943344, + 0.06188946217298508, + 0.062077902257442474, + 0.06261446326971054, + 0.06335969269275665, + 0.06411378085613251, + 0.06387976557016373, + 0.06240350380539894, + 0.06096135452389717, + 0.05941952019929886, + 0.05748108774423599, + 0.05560588836669922, + 0.05379186570644379, + 0.05202660709619522, + 0.05031926929950714, + 0.04866796359419823, + 0.047058481723070145, + 0.04549827426671982, + 0.04398979991674423, + 0.042593952268362045, + 0.04130672663450241, + 0.040058400481939316, + 0.03885875269770622, + 0.037737227976322174, + 0.03664807602763176, + 0.03559035807847977, + 0.03404499590396881, + 0.03251116722822189, + 0.031046444550156593, + 0.029722703620791435, + 0.02850816212594509, + 0.027343248948454857, + 0.007517288438975811, + 0.007759046275168657, + 0.008154538460075855, + 0.008621730841696262, + 0.009109127335250378, + 0.009297020733356476, + 0.009488789364695549, + 0.009632308967411518, + 0.009639428928494453, + 0.009646552614867687, + 0.009816871024668217, + 0.010150156915187836, + 0.010494757443666458, + 0.010959231294691563, + 0.011484919115900993, + 0.012035822495818138, + 0.012243344448506832, + 0.012432562187314034, + 0.012685706838965416, + 0.01334646437317133, + 0.014041638001799583, + 0.01474862452596426, + 0.015434837900102139, + 0.01615297980606556, + 0.01667271926999092, + 0.016945431008934975, + 0.017222603783011436, + 0.01788470335304737, + 0.01882273517549038, + 0.019809963181614876, + 0.020633287727832794, + 0.021414095535874367, + 0.02222445048391819, + 0.0233901496976614, + 0.024675050750374794, + 0.026030534878373146, + 0.02648284286260605, + 0.02689298987388611, + 0.027336029335856438, + 0.028662823140621185, + 0.030054014176130295, + 0.03147975727915764, + 0.03263813629746437, + 0.033839140087366104, + 0.03513352945446968, + 0.03679516166448593, + 0.038535382598638535, + 0.040152695029973984, + 0.0407981276512146, + 0.04145393520593643, + 0.042364731431007385, + 0.04444319009780884, + 0.04662361368536949, + 0.04862334579229355, + 0.04933641478419304, + 0.05005994439125061, + 0.05083700641989708, + 0.051862895488739014, + 0.0529094897210598, + 0.0539528951048851, + 0.05483144521713257, + 0.05572429671883583, + 0.05660350248217583, + 0.057068414986133575, + 0.05753714591264725, + 0.05800972878932953, + 0.05813702940940857, + 0.058261092752218246, + 0.05838541314005852, + 0.05860401690006256, + 0.05883391574025154, + 0.059064723551273346, + 0.059469908475875854, + 0.059923574328422546, + 0.06038070470094681, + 0.0605117529630661, + 0.060479722917079926, + 0.06044771149754524, + 0.060604844242334366, + 0.06093389913439751, + 0.06126473471522331, + 0.06071911007165909, + 0.05869828164577484, + 0.056744709610939026, + 0.05528704449534416, + 0.055720068514347076, + 0.05615647882223129, + 0.0565963052213192, + 0.05427215248346329, + 0.052022747695446014, + 0.04986657202243805, + 0.048038605600595474, + 0.04634343460202217, + 0.04470808431506157, + 0.04299810528755188, + 0.041248101741075516, + 0.039569322019815445, + 0.03797464817762375, + 0.036480266600847244, + 0.03504469245672226, + 0.03369605541229248, + 0.033446699380874634, + 0.033199191093444824, + 0.03295351192355156, + 0.03232183679938316, + 0.031570177525281906, + 0.030835997313261032, + 0.029502473771572113, + 0.027479466050863266, + 0.025595178827643394, + 0.02390984073281288, + 0.022863175719976425, + 0.0218623299151659, + 0.008335101418197155, + 0.008607792668044567, + 0.00894987490028143, + 0.009390188381075859, + 0.00985216535627842, + 0.010274289175868034, + 0.010686115361750126, + 0.011114448308944702, + 0.011127003468573093, + 0.011116474866867065, + 0.011176046915352345, + 0.01155092567205429, + 0.011938377283513546, + 0.012392965145409107, + 0.012947285547852516, + 0.013526398688554764, + 0.014027425087988377, + 0.014479166828095913, + 0.014945457689464092, + 0.01544159185141325, + 0.015957973897457123, + 0.01649162359535694, + 0.017249716445803642, + 0.01804790087044239, + 0.01887967251241207, + 0.01972726546227932, + 0.02061290666460991, + 0.02135060913860798, + 0.021614599972963333, + 0.02188185416162014, + 0.022374887019395828, + 0.023220503702759743, + 0.024098077788949013, + 0.025114398449659348, + 0.02627863734960556, + 0.02749684639275074, + 0.029087621718645096, + 0.030989672988653183, + 0.033016104251146317, + 0.034195613116025925, + 0.0349566750228405, + 0.03573467582464218, + 0.03626123070716858, + 0.03670216351747513, + 0.037148453295230865, + 0.03844708204269409, + 0.040030114352703094, + 0.041678328067064285, + 0.0440487265586853, + 0.04671184718608856, + 0.04953597113490105, + 0.050918951630592346, + 0.05199846997857094, + 0.05310088023543358, + 0.054194413125514984, + 0.055303242057561874, + 0.056434761732816696, + 0.05848473682999611, + 0.06084796413779259, + 0.06330668181180954, + 0.06461213529109955, + 0.0655386671423912, + 0.06647849828004837, + 0.06650054454803467, + 0.066126249730587, + 0.06575406342744827, + 0.06537655740976334, + 0.06499677896499634, + 0.06461922079324722, + 0.06388509273529053, + 0.062850221991539, + 0.06183211877942085, + 0.06141684949398041, + 0.061805423349142075, + 0.062196459621191025, + 0.061932336539030075, + 0.06014586240053177, + 0.058410920202732086, + 0.05673966929316521, + 0.05518994852900505, + 0.053682561963796616, + 0.052216339856386185, + 0.05023420602083206, + 0.04832209274172783, + 0.04648276045918465, + 0.04537305235862732, + 0.04444196820259094, + 0.04352999106049538, + 0.04223368316888809, + 0.04073033854365349, + 0.03928051143884659, + 0.03783322498202324, + 0.03636740893125534, + 0.034958384931087494, + 0.03374737501144409, + 0.03330274298787117, + 0.03286397084593773, + 0.0324309803545475, + 0.030688144266605377, + 0.028918549418449402, + 0.027250999584794044, + 0.02634808048605919, + 0.025847187265753746, + 0.025355815887451172, + 0.024819176644086838, + 0.024195006117224693, + 0.023586532101035118, + 0.022986913099884987, + 0.022261589765548706, + 0.021559152752161026, + 0.020878879353404045, + 0.02003905549645424, + 0.019164610654115677, + 0.008607289753854275, + 0.009108742699027061, + 0.009580940008163452, + 0.009769288823008537, + 0.009961342439055443, + 0.010194710455834866, + 0.010484679602086544, + 0.010782896541059017, + 0.011072512716054916, + 0.011361699551343918, + 0.011658440344035625, + 0.01184120960533619, + 0.012015636079013348, + 0.012210444547235966, + 0.012523753568530083, + 0.01284510176628828, + 0.013223073445260525, + 0.013709166087210178, + 0.014213129878044128, + 0.014730896800756454, + 0.015263167209923267, + 0.01581467129290104, + 0.01653372123837471, + 0.017351586371660233, + 0.0182099100202322, + 0.018858369439840317, + 0.019487015902996063, + 0.02013661526143551, + 0.021512869745492935, + 0.022984247654676437, + 0.024440590292215347, + 0.025129614397883415, + 0.025838062167167664, + 0.026725197210907936, + 0.028195420280098915, + 0.0297465231269598, + 0.03127755969762802, + 0.032656583935022354, + 0.03409641236066818, + 0.035176798701286316, + 0.035643450915813446, + 0.03611629456281662, + 0.03674754500389099, + 0.0375739224255085, + 0.038418881595134735, + 0.039809584617614746, + 0.04180283099412918, + 0.04389588162302971, + 0.04575882852077484, + 0.04738863557577133, + 0.04907649755477905, + 0.05141712352633476, + 0.05441439896821976, + 0.05758639797568321, + 0.0607830174267292, + 0.06400586664676666, + 0.06739959865808487, + 0.06965463608503342, + 0.07066171616315842, + 0.0716833621263504, + 0.07371977716684341, + 0.07703522592782974, + 0.08049978315830231, + 0.08195047825574875, + 0.08024504780769348, + 0.07857509702444077, + 0.07730184495449066, + 0.07679177820682526, + 0.07628507912158966, + 0.07543583959341049, + 0.07347562909126282, + 0.07156635820865631, + 0.06959811598062515, + 0.06692265719175339, + 0.06435004621744156, + 0.061876330524683, + 0.05984221026301384, + 0.05787745118141174, + 0.05597720667719841, + 0.05276862159371376, + 0.049513012170791626, + 0.04645825922489166, + 0.04421096667647362, + 0.04234922304749489, + 0.04056587815284729, + 0.038810331374406815, + 0.037085697054862976, + 0.035437703132629395, + 0.0338619239628315, + 0.032353948801755905, + 0.030913129448890686, + 0.02953300252556801, + 0.028178026899695396, + 0.02688521519303322, + 0.0256517194211483, + 0.02457430399954319, + 0.023559337481856346, + 0.022586289793252945, + 0.021697483956813812, + 0.020872700959444046, + 0.020079271867871284, + 0.01936808042228222, + 0.01878880150616169, + 0.018226847052574158, + 0.01767740026116371, + 0.017010362818837166, + 0.016368495300412178, + 0.01575084775686264, + 0.015205414965748787, + 0.014697213657200336, + 0.014205997809767723, + 0.013803273439407349, + 0.013521084561944008, + 0.0062609170563519, + 0.006419346667826176, + 0.006581785157322884, + 0.006687391549348831, + 0.006791975349187851, + 0.006929114926606417, + 0.007180070038884878, + 0.007440113928169012, + 0.00767716346308589, + 0.007884625345468521, + 0.008097694255411625, + 0.008429663255810738, + 0.008824526332318783, + 0.009237885475158691, + 0.00962861068546772, + 0.01003235299140215, + 0.010431352071464062, + 0.010694765485823154, + 0.010964830406010151, + 0.011231089942157269, + 0.011480274610221386, + 0.011734988540410995, + 0.012237242422997952, + 0.013032013550400734, + 0.01387840136885643, + 0.014380521140992641, + 0.014675549231469631, + 0.014976631850004196, + 0.015967728570103645, + 0.017233461141586304, + 0.018599526956677437, + 0.018905213102698326, + 0.019095633178949356, + 0.019297977909445763, + 0.020338254049420357, + 0.021434608846902847, + 0.022578414529561996, + 0.02367660216987133, + 0.02482820674777031, + 0.02601863443851471, + 0.02718268893659115, + 0.028398822993040085, + 0.029703078791499138, + 0.03118225745856762, + 0.032735101878643036, + 0.03435486927628517, + 0.03602621331810951, + 0.037778861820697784, + 0.04030453413724899, + 0.04475390166044235, + 0.04969445988535881, + 0.054342400282621384, + 0.05742235854268074, + 0.060676880180835724, + 0.0646573156118393, + 0.07026726752519608, + 0.07636396586894989, + 0.08259020745754242, + 0.08818650245666504, + 0.09416201710700989, + 0.10034961998462677, + 0.10626021772623062, + 0.11251895129680634, + 0.1181272491812706, + 0.11892545968294144, + 0.11972906440496445, + 0.11992239207029343, + 0.11423753201961517, + 0.10882216691970825, + 0.10366351157426834, + 0.09765002131462097, + 0.09198302775621414, + 0.08664490282535553, + 0.08076073229312897, + 0.07517353445291519, + 0.06997287273406982, + 0.06389152258634567, + 0.05797684192657471, + 0.05260970816016197, + 0.0481627956032753, + 0.04434342682361603, + 0.040826939046382904, + 0.03739593178033829, + 0.034031663089990616, + 0.030970055609941483, + 0.02839159220457077, + 0.026578335091471672, + 0.02488088794052601, + 0.02328634448349476, + 0.02171153388917446, + 0.020243225619196892, + 0.018874214962124825, + 0.017844287678599358, + 0.016915474086999893, + 0.016035005450248718, + 0.015274901874363422, + 0.01459790114313364, + 0.01395090576261282, + 0.01327555626630783, + 0.012531322427093983, + 0.011828810907900333, + 0.011187640950083733, + 0.010848503559827805, + 0.010519646108150482, + 0.010200757533311844, + 0.009775077924132347, + 0.00933605246245861, + 0.008916744962334633, + 0.008686069399118423, + 0.00865193735808134, + 0.008617940358817577, + 0.008540154434740543, + 0.008201253600418568, + 0.0030460061971098185, + 0.0031560605857521296, + 0.0032700917217880487, + 0.003350399900227785, + 0.00342367822304368, + 0.0035059053916484118, + 0.003684410359710455, + 0.003872003871947527, + 0.004016599617898464, + 0.0040550087578594685, + 0.0040937853045761585, + 0.004216703586280346, + 0.004413127899169922, + 0.004618701990693808, + 0.004906582646071911, + 0.005235054064542055, + 0.0055855149403214455, + 0.005621940363198519, + 0.0056508914567530155, + 0.005738491658121347, + 0.0061410763300955296, + 0.006571904756128788, + 0.0069885519333183765, + 0.007338338065892458, + 0.007705631200224161, + 0.008014548569917679, + 0.008253071457147598, + 0.008498692885041237, + 0.00896243192255497, + 0.009586233645677567, + 0.010253453627228737, + 0.010749755427241325, + 0.011194903403520584, + 0.011658485047519207, + 0.012377523817121983, + 0.013183741830289364, + 0.014042472466826439, + 0.014904393814504147, + 0.015815990045666695, + 0.0167833361774683, + 0.017809497192502022, + 0.01889839954674244, + 0.02005063183605671, + 0.021231120452284813, + 0.02248111180961132, + 0.02390103228390217, + 0.026204092428088188, + 0.028729073703289032, + 0.03143109008669853, + 0.03394411504268646, + 0.03665807098150253, + 0.039852019399404526, + 0.04502711817622185, + 0.050874244421720505, + 0.057862043380737305, + 0.06861945241689682, + 0.0813768282532692, + 0.09591737389564514, + 0.10757442563772202, + 0.12064819782972336, + 0.13520385324954987, + 0.14981693029403687, + 0.16600942611694336, + 0.18387793004512787, + 0.18585304915905, + 0.18784940242767334, + 0.18986719846725464, + 0.17313209176063538, + 0.1565774381160736, + 0.14160571992397308, + 0.12717384099960327, + 0.11404961347579956, + 0.10227978229522705, + 0.08944448083639145, + 0.07744607329368591, + 0.06705717742443085, + 0.057942796498537064, + 0.049994684755802155, + 0.043136827647686005, + 0.03733290359377861, + 0.03243626654148102, + 0.028181880712509155, + 0.024575691670179367, + 0.021643541753292084, + 0.01906123198568821, + 0.016832586377859116, + 0.015291707590222359, + 0.013891884125769138, + 0.012620201334357262, + 0.011345013976097107, + 0.01018479373306036, + 0.009143225848674774, + 0.008403686806559563, + 0.007816015742719173, + 0.007269441150128841, + 0.006800855975598097, + 0.0064127491787076, + 0.006046789698302746, + 0.005733800120651722, + 0.0055874609388411045, + 0.0054448568262159824, + 0.005305892787873745, + 0.005007625557482243, + 0.004708548542112112, + 0.0044273328967392445, + 0.004222092684358358, + 0.004064052831381559, + 0.003911928273737431, + 0.003768258262425661, + 0.0036363634280860424, + 0.0035090851597487926, + 0.0033862616401165724, + 0.003250440116971731, + 0.0040430654771625996, + 0.004180560819804668, + 0.004322732333093882, + 0.004509916063398123, + 0.00472143804654479, + 0.004942880943417549, + 0.005175630562007427, + 0.005419353488832712, + 0.00567193329334259, + 0.005927335936576128, + 0.006194239016622305, + 0.00642735417932272, + 0.006615464575588703, + 0.006809080485254526, + 0.007038589101284742, + 0.007290274370461702, + 0.007550960406661034, + 0.007831468246877193, + 0.008123796433210373, + 0.008428470231592655, + 0.008763755671679974, + 0.00911237858235836, + 0.009558189660310745, + 0.010304547846317291, + 0.011109188199043274, + 0.011801483109593391, + 0.012258339673280716, + 0.012732882052659988, + 0.013313686475157738, + 0.014001674950122833, + 0.01472521387040615, + 0.015407182276248932, + 0.0160775575786829, + 0.016777101904153824, + 0.01773722469806671, + 0.018829163163900375, + 0.019988322630524635, + 0.02082016132771969, + 0.02161458134651184, + 0.022439314052462578, + 0.023758936673402786, + 0.02519715577363968, + 0.026722436770796776, + 0.028238747268915176, + 0.0298389233648777, + 0.031553514301776886, + 0.03462707996368408, + 0.038000039756298065, + 0.04166289418935776, + 0.04474442079663277, + 0.048053864389657974, + 0.05170189589262009, + 0.05761031061410904, + 0.06419393420219421, + 0.0715460553765297, + 0.08018811047077179, + 0.0898740291595459, + 0.10070563852787018, + 0.11046813428401947, + 0.12117698788642883, + 0.13292399048805237, + 0.1412912905216217, + 0.15002208948135376, + 0.15929237008094788, + 0.1539904773235321, + 0.14740411937236786, + 0.1410994678735733, + 0.1321224719285965, + 0.12314347922801971, + 0.11477470397949219, + 0.10492691397666931, + 0.09523901343345642, + 0.08644560724496841, + 0.07857745885848999, + 0.0714898630976677, + 0.06504154950380325, + 0.05818581581115723, + 0.051126644015312195, + 0.04492390528321266, + 0.03953149914741516, + 0.03488747403025627, + 0.03078901395201683, + 0.027201222255825996, + 0.024159250780940056, + 0.021457470953464508, + 0.01905783638358116, + 0.01740933395922184, + 0.015910787507891655, + 0.014541231095790863, + 0.013221146538853645, + 0.012003538198769093, + 0.010898065753281116, + 0.01014777459204197, + 0.009638325311243534, + 0.00915445201098919, + 0.008711778558790684, + 0.008324536494910717, + 0.007954508066177368, + 0.007580007892102003, + 0.006940876599401236, + 0.006355635356158018, + 0.005819740239530802, + 0.0055782306008040905, + 0.0054123918525874615, + 0.005251483991742134, + 0.00506519665941596, + 0.004856056533753872, + 0.0046555520966649055, + 0.004471835680305958, + 0.004332071170210838, + 0.0041966745629906654, + 0.004065509419888258, + 0.003920391667634249, + 0.007967591285705566, + 0.008200217969715595, + 0.008439634926617146, + 0.008832437917590141, + 0.009312349371612072, + 0.009818336926400661, + 0.010106117464601994, + 0.01039091031998396, + 0.010705052874982357, + 0.011114547029137611, + 0.011539706028997898, + 0.012071993201971054, + 0.012752220965921879, + 0.013470776379108429, + 0.014000281691551208, + 0.014426174573600292, + 0.014865022152662277, + 0.015464134514331818, + 0.016113273799419403, + 0.016780637204647064, + 0.017260195687413216, + 0.01775345951318741, + 0.01836826652288437, + 0.01942501589655876, + 0.020542562007904053, + 0.021637139841914177, + 0.02263113670051098, + 0.023670798167586327, + 0.024591850116848946, + 0.025379106402397156, + 0.02619156800210476, + 0.02755553089082241, + 0.02932782657444477, + 0.03121410869061947, + 0.03192140534520149, + 0.03216644003987312, + 0.032413359731435776, + 0.033924926072359085, + 0.03580544888973236, + 0.0377902090549469, + 0.039028894156217575, + 0.04020234942436218, + 0.04141108691692352, + 0.042877744883298874, + 0.044408928602933884, + 0.04599478840827942, + 0.04827561974525452, + 0.05067788437008858, + 0.053194668143987656, + 0.05535078048706055, + 0.05759428068995476, + 0.059946317225694656, + 0.06347332894802094, + 0.06720785051584244, + 0.0711541473865509, + 0.07397080212831497, + 0.0768989622592926, + 0.07994303107261658, + 0.08271338045597076, + 0.08557073771953583, + 0.08852680772542953, + 0.0902041345834732, + 0.09181399643421173, + 0.093452587723732, + 0.09421846270561218, + 0.09485749900341034, + 0.09550086408853531, + 0.09261348843574524, + 0.08893681317567825, + 0.0854061096906662, + 0.08113666623830795, + 0.07671865075826645, + 0.07254120707511902, + 0.06825783848762512, + 0.06400296092033386, + 0.0600133091211319, + 0.05564645677804947, + 0.05089770257472992, + 0.04655420035123825, + 0.04267515987157822, + 0.03931964561343193, + 0.03622797504067421, + 0.033351581543684006, + 0.030538784340023994, + 0.02796320989727974, + 0.0256048534065485, + 0.023774143308401108, + 0.022090744227170944, + 0.020526546984910965, + 0.019099965691566467, + 0.017781026661396027, + 0.01655316725373268, + 0.015485516749322414, + 0.014550698921084404, + 0.013672315515577793, + 0.012917248532176018, + 0.012370754964649677, + 0.011847381480038166, + 0.011351775377988815, + 0.011056541465222836, + 0.010768987238407135, + 0.010488910600543022, + 0.010034301318228245, + 0.009543243795633316, + 0.009076218120753765, + 0.00866555143147707, + 0.008311226032674313, + 0.007971389219164848, + 0.0076691098511219025, + 0.007511770818382502, + 0.007357659749686718, + 0.007206710521131754, + 0.006965098436921835, + 0.00930025428533554, + 0.009781315922737122, + 0.010287259705364704, + 0.010862435214221478, + 0.011487317271530628, + 0.012148147448897362, + 0.012486832216382027, + 0.01282974798232317, + 0.013244402594864368, + 0.013884778134524822, + 0.014556115493178368, + 0.015238452702760696, + 0.015927201136946678, + 0.016647078096866608, + 0.017523279413580894, + 0.018505947664380074, + 0.01954372227191925, + 0.0205383338034153, + 0.02156992256641388, + 0.02266661636531353, + 0.023999737575650215, + 0.02541126310825348, + 0.02680029720067978, + 0.027919555082917213, + 0.0290855560451746, + 0.030293764546513557, + 0.031541857868433, + 0.03284136950969696, + 0.03411068022251129, + 0.03535333648324013, + 0.03664126247167587, + 0.03821534663438797, + 0.03998859226703644, + 0.041844118386507034, + 0.04374327138066292, + 0.04571472108364105, + 0.0477750301361084, + 0.05017385259270668, + 0.05273851379752159, + 0.05543426424264908, + 0.05691725015640259, + 0.058326732367277145, + 0.05977112427353859, + 0.06047580763697624, + 0.06117294728755951, + 0.06188537925481796, + 0.06296879798173904, + 0.0640711858868599, + 0.0651596412062645, + 0.06551778316497803, + 0.06587789207696915, + 0.06628383696079254, + 0.06754918396472931, + 0.0688386857509613, + 0.07012999057769775, + 0.0708707794547081, + 0.07161939144134521, + 0.07235728949308395, + 0.07146099209785461, + 0.0705757886171341, + 0.06970155984163284, + 0.06906916946172714, + 0.068450428545475, + 0.06783723831176758, + 0.06770039349794388, + 0.06761342287063599, + 0.06752656400203705, + 0.06652573496103287, + 0.06535143405199051, + 0.06419786065816879, + 0.061360541731119156, + 0.05805587396025658, + 0.05492918938398361, + 0.051976319402456284, + 0.04918539524078369, + 0.046544335782527924, + 0.043527670204639435, + 0.04019743576645851, + 0.03712199255824089, + 0.034343279898166656, + 0.03188556060194969, + 0.029603729024529457, + 0.027501707896590233, + 0.025624822825193405, + 0.023876028135418892, + 0.022246582433581352, + 0.02115768939256668, + 0.02012888342142105, + 0.019150104373693466, + 0.018003158271312714, + 0.016868537291884422, + 0.015805423259735107, + 0.015054096467792988, + 0.014523969031870365, + 0.014012510888278484, + 0.013529408723115921, + 0.013084045611321926, + 0.012653343379497528, + 0.01222654152661562, + 0.011671412736177444, + 0.011141489259898663, + 0.010635626502335072, + 0.010177015326917171, + 0.009744392707943916, + 0.009330161847174168, + 0.009084434248507023, + 0.008997405879199505, + 0.008911211043596268, + 0.008762665092945099, + 0.008344476111233234, + 0.007946246303617954, + 0.0075670210644602776, + 0.00739712780341506, + 0.010659048333764076, + 0.011265409179031849, + 0.01190626434981823, + 0.012088109739124775, + 0.012158012017607689, + 0.012287182733416557, + 0.013177144341170788, + 0.014131564646959305, + 0.015023920685052872, + 0.01568521372973919, + 0.01637561433017254, + 0.017122825607657433, + 0.017926115542650223, + 0.018767090514302254, + 0.019612085074186325, + 0.02048438787460327, + 0.0213954895734787, + 0.0235636867582798, + 0.025983810424804688, + 0.02833409793674946, + 0.029180211946368217, + 0.030051589012145996, + 0.03116108663380146, + 0.03275461867451668, + 0.0344296433031559, + 0.03605521097779274, + 0.03760995715856552, + 0.03923174366354942, + 0.04124392196536064, + 0.043560925871133804, + 0.04600810259580612, + 0.047921791672706604, + 0.049683574587106705, + 0.05151012912392616, + 0.05385414883494377, + 0.05638471990823746, + 0.05903419852256775, + 0.061457786709070206, + 0.06395985186100006, + 0.06654127687215805, + 0.06801491230726242, + 0.06952118128538132, + 0.07103262841701508, + 0.07222648710012436, + 0.07344041764736176, + 0.07448641210794449, + 0.07410873472690582, + 0.07373297214508057, + 0.0733412504196167, + 0.07284221053123474, + 0.07234656810760498, + 0.07203737646341324, + 0.07280009239912033, + 0.07357089221477509, + 0.07385602593421936, + 0.07108333706855774, + 0.06841473281383514, + 0.0658746212720871, + 0.06365066021680832, + 0.06150178983807564, + 0.059549227356910706, + 0.059394095093011856, + 0.05923936888575554, + 0.05907397344708443, + 0.05645269155502319, + 0.053947724401950836, + 0.051553912460803986, + 0.049840047955513, + 0.04822779819369316, + 0.04666770622134209, + 0.044567741453647614, + 0.042447809129953384, + 0.04042871668934822, + 0.03827067092061043, + 0.036140333861112595, + 0.0341285802423954, + 0.032211657613515854, + 0.030390974134206772, + 0.02867319993674755, + 0.027079448103904724, + 0.02560700848698616, + 0.02421463280916214, + 0.022862883284687996, + 0.02149791456758976, + 0.02021443285048008, + 0.019043372943997383, + 0.018296409398317337, + 0.017578745260834694, + 0.016889231279492378, + 0.0162047129124403, + 0.015545200556516647, + 0.014912528917193413, + 0.014340591616928577, + 0.013807551003992558, + 0.013294323347508907, + 0.012697134166955948, + 0.011995946057140827, + 0.011333479546010494, + 0.010755045339465141, + 0.010428004898130894, + 0.01011090911924839, + 0.00980345718562603, + 0.009455833584070206, + 0.009114992804825306, + 0.008786437101662159, + 0.008544178679585457, + 0.008356732316315174, + 0.008173398673534393, + 0.008035469800233841, + 0.008000082336366177, + 0.007964849472045898, + 0.007929773069918156, + 0.007567449938505888, + 0.010748828761279583, + 0.011423882097005844, + 0.012141330167651176, + 0.012694396078586578, + 0.013263084925711155, + 0.013841296546161175, + 0.014386833645403385, + 0.014953873120248318, + 0.01596936583518982, + 0.017576098442077637, + 0.01934449002146721, + 0.020215138792991638, + 0.0206759050488472, + 0.021147171035408974, + 0.022165823727846146, + 0.0232793390750885, + 0.024419810622930527, + 0.025411130860447884, + 0.026442695409059525, + 0.0278328824788332, + 0.030031582340598106, + 0.03240397199988365, + 0.03493938967585564, + 0.03764554113149643, + 0.040561284869909286, + 0.04247761517763138, + 0.04378637298941612, + 0.04513545334339142, + 0.04687988758087158, + 0.0487946979701519, + 0.05078772082924843, + 0.05358872562646866, + 0.05662507936358452, + 0.059840284287929535, + 0.0638226643204689, + 0.06807006150484085, + 0.07213690876960754, + 0.07229834049940109, + 0.07246013730764389, + 0.07285542786121368, + 0.0743509903550148, + 0.07587724924087524, + 0.0771920308470726, + 0.07773115485906601, + 0.07827402651309967, + 0.07906978577375412, + 0.08053634315729141, + 0.08203010261058807, + 0.08212307095527649, + 0.07898615300655365, + 0.07596907019615173, + 0.07325105369091034, + 0.07102899253368378, + 0.06887433677911758, + 0.06650394201278687, + 0.0635848343372345, + 0.06079385429620743, + 0.058325644582509995, + 0.056471265852451324, + 0.05467584356665611, + 0.05260516330599785, + 0.0495590902864933, + 0.04668939486145973, + 0.04422266408801079, + 0.04299786314368248, + 0.041806988418102264, + 0.04062068462371826, + 0.039198607206344604, + 0.03782631829380989, + 0.03650206699967384, + 0.03469861298799515, + 0.03298313543200493, + 0.031352464109659195, + 0.02995293401181698, + 0.02863454259932041, + 0.027374178171157837, + 0.02650570124387741, + 0.025771068409085274, + 0.02505679614841938, + 0.023931659758090973, + 0.022595755755901337, + 0.02133442461490631, + 0.020452769473195076, + 0.019987111911177635, + 0.019532056525349617, + 0.018930500373244286, + 0.01792091503739357, + 0.016965169459581375, + 0.016089830547571182, + 0.015714548528194427, + 0.015348021872341633, + 0.014990042895078659, + 0.014394461177289486, + 0.013777854852378368, + 0.01318766362965107, + 0.012678015977144241, + 0.012223275378346443, + 0.011784844100475311, + 0.01142291072756052, + 0.011183883994817734, + 0.010949857532978058, + 0.010704649612307549, + 0.010267367586493492, + 0.009847949258983135, + 0.00944566447287798, + 0.009234092198312283, + 0.009075703099370003, + 0.008920030668377876, + 0.008834040723741055, + 0.00882436241954565, + 0.008814696222543716, + 0.008749695494771004, + 0.00835608784109354, + 0.010563304647803307, + 0.01126414816826582, + 0.011951826512813568, + 0.012363046407699585, + 0.012788414023816586, + 0.01340651884675026, + 0.014305800199508667, + 0.015265404246747494, + 0.016074439510703087, + 0.016821369528770447, + 0.017603008076548576, + 0.01864764466881752, + 0.01977631077170372, + 0.02091522142291069, + 0.021734435111284256, + 0.022585734724998474, + 0.02352607436478138, + 0.024618349969387054, + 0.02576133981347084, + 0.027146432548761368, + 0.028784630820155144, + 0.030521687120199203, + 0.0320417620241642, + 0.033494733273983, + 0.0350135937333107, + 0.03690246120095253, + 0.0389459989964962, + 0.04110270366072655, + 0.04416899383068085, + 0.04746522754430771, + 0.05085092782974243, + 0.05329839140176773, + 0.055863652378320694, + 0.058519650250673294, + 0.061188120394945145, + 0.06397826969623566, + 0.06688281893730164, + 0.06989114731550217, + 0.07303477823734283, + 0.0762249305844307, + 0.07940537482500076, + 0.08271852880716324, + 0.08495305478572845, + 0.0857912227511406, + 0.08663766831159592, + 0.08631128817796707, + 0.0848272368311882, + 0.0833687037229538, + 0.08221028745174408, + 0.08131299167871475, + 0.08042548596858978, + 0.07831872254610062, + 0.07524298131465912, + 0.07228803634643555, + 0.06851856410503387, + 0.06416535377502441, + 0.06008873134851456, + 0.05683623254299164, + 0.05429396405816078, + 0.05186540633440018, + 0.04947085306048393, + 0.04710371792316437, + 0.04484985023736954, + 0.04317488893866539, + 0.04224666208028793, + 0.041338395327329636, + 0.04002576693892479, + 0.03791867196559906, + 0.03592250123620033, + 0.03418714180588722, + 0.033030763268470764, + 0.03191349655389786, + 0.030748466029763222, + 0.02903461828827858, + 0.027416300028562546, + 0.02588818222284317, + 0.025323819369077682, + 0.024778304621577263, + 0.02424454130232334, + 0.023339180275797844, + 0.02240135334432125, + 0.02150120958685875, + 0.020594822242856026, + 0.019707774743437767, + 0.018858931958675385, + 0.01831885613501072, + 0.018061809241771698, + 0.017808368429541588, + 0.01747404783964157, + 0.016955234110355377, + 0.016451820731163025, + 0.015959739685058594, + 0.015443827956914902, + 0.014944594353437424, + 0.014461499638855457, + 0.013856492936611176, + 0.013253217563033104, + 0.012676207348704338, + 0.012248772196471691, + 0.011918868869543076, + 0.011597849428653717, + 0.011271830648183823, + 0.010926967486739159, + 0.010592656210064888, + 0.01027208287268877, + 0.01007170882076025, + 0.009875244460999966, + 0.009682612493634224, + 0.009496415965259075, + 0.009314818307757378, + 0.009136692620813847, + 0.008946912363171577, + 0.008738297037780285, + 0.01104037743061781, + 0.011421595700085163, + 0.0117575041949749, + 0.012023365125060081, + 0.012295237742364407, + 0.012889890931546688, + 0.013660913333296776, + 0.014478054828941822, + 0.015032384544610977, + 0.015590531751513481, + 0.016179395839571953, + 0.01683615706861019, + 0.017519578337669373, + 0.01836400479078293, + 0.019454730674624443, + 0.02061023935675621, + 0.021673765033483505, + 0.022685915231704712, + 0.023745331913232803, + 0.024888286367058754, + 0.026095056906342506, + 0.02736033871769905, + 0.029421424493193626, + 0.03165707737207413, + 0.03386631980538368, + 0.03490811958909035, + 0.03598197177052498, + 0.03746424987912178, + 0.04004781320691109, + 0.042809538543224335, + 0.04587528109550476, + 0.049341559410095215, + 0.053069744259119034, + 0.05606035515666008, + 0.05821355804800987, + 0.06044946238398552, + 0.06296855956315994, + 0.06572654098272324, + 0.06860532611608505, + 0.07220336049795151, + 0.07628122717142105, + 0.0805893987417221, + 0.08482316136360168, + 0.08916456252336502, + 0.09372815489768982, + 0.09450996667146683, + 0.09423814713954926, + 0.09396710991859436, + 0.09167393296957016, + 0.08899612724781036, + 0.08639653772115707, + 0.08188208937644958, + 0.07721231132745743, + 0.07280884683132172, + 0.06883794069290161, + 0.06512132287025452, + 0.061605360358953476, + 0.05748649686574936, + 0.053456082940101624, + 0.04970824345946312, + 0.04753631725907326, + 0.045870546251535416, + 0.044263146817684174, + 0.04218015819787979, + 0.03997931629419327, + 0.03789330646395683, + 0.03708115592598915, + 0.036988358944654465, + 0.03689579293131828, + 0.035744134336709976, + 0.03375367820262909, + 0.03187406435608864, + 0.030245374888181686, + 0.028889721259474754, + 0.027594832703471184, + 0.026425205171108246, + 0.025458261370658875, + 0.024526698514819145, + 0.0236650537699461, + 0.023026825860142708, + 0.02240580879151821, + 0.0218015406280756, + 0.021278880536556244, + 0.020769378170371056, + 0.02027207612991333, + 0.01962636038661003, + 0.01896505057811737, + 0.01832602359354496, + 0.017875809222459793, + 0.01754075102508068, + 0.017211969941854477, + 0.0168225709348917, + 0.01634305715560913, + 0.015877211466431618, + 0.01540739368647337, + 0.014865327626466751, + 0.014342332258820534, + 0.013837737962603569, + 0.013865847140550613, + 0.013946164399385452, + 0.014026949182152748, + 0.013765718787908554, + 0.013323307037353516, + 0.012895115651190281, + 0.012469952926039696, + 0.012039572931826115, + 0.01162404753267765, + 0.011223415844142437, + 0.010848629288375378, + 0.010486358776688576, + 0.010136185213923454, + 0.009850791655480862, + 0.00959395244717598, + 0.007661820854991674, + 0.0079518286511302, + 0.008425837382674217, + 0.008989810943603516, + 0.009590755216777325, + 0.010191998444497585, + 0.010830935090780258, + 0.011469614692032337, + 0.012033944018185139, + 0.0126260407269001, + 0.013229981064796448, + 0.013845664449036121, + 0.01448999997228384, + 0.015524858608841896, + 0.01677394099533558, + 0.018123522400856018, + 0.018527483567595482, + 0.01887860894203186, + 0.019326992332935333, + 0.02038552239537239, + 0.021502025425434113, + 0.022674841806292534, + 0.023900382220745087, + 0.02519216015934944, + 0.02681010216474533, + 0.028840217739343643, + 0.031024053692817688, + 0.033216606825590134, + 0.03545999526977539, + 0.03785489872097969, + 0.04049062728881836, + 0.04333901405334473, + 0.046387769281864166, + 0.049661166965961456, + 0.053167395293712616, + 0.05692116543650627, + 0.0603017620742321, + 0.06384865939617157, + 0.0676262155175209, + 0.07237707823514938, + 0.07746170461177826, + 0.08294834196567535, + 0.08929307013750076, + 0.0961230993270874, + 0.1028059646487236, + 0.10562249273061752, + 0.10851620137691498, + 0.1101512536406517, + 0.1053415834903717, + 0.1007419303059578, + 0.09623432904481888, + 0.09146006405353546, + 0.08692265301942825, + 0.0823037326335907, + 0.07659389823675156, + 0.07128018140792847, + 0.06611516326665878, + 0.06023107096552849, + 0.05487065017223358, + 0.050335414707660675, + 0.048640746623277664, + 0.047003135085105896, + 0.04543498530983925, + 0.04412766918540001, + 0.04285796731710434, + 0.041624799370765686, + 0.03913533315062523, + 0.03678266704082489, + 0.034571435302495956, + 0.033208318054676056, + 0.031976066529750824, + 0.030789539217948914, + 0.0299395564943552, + 0.029187778010964394, + 0.02845487929880619, + 0.027571888640522957, + 0.026635585352778435, + 0.025731081143021584, + 0.024731110781431198, + 0.023661166429519653, + 0.022637512534856796, + 0.021895578131079674, + 0.02158217877149582, + 0.021273260936141014, + 0.02084553800523281, + 0.01991250179708004, + 0.019021227955818176, + 0.018169846385717392, + 0.017671117559075356, + 0.0171885434538126, + 0.016719147562980652, + 0.016283998265862465, + 0.015866125002503395, + 0.015458975918591022, + 0.015050649642944336, + 0.014643711969256401, + 0.014247777871787548, + 0.013840395957231522, + 0.013393641449511051, + 0.012961307540535927, + 0.01254207268357277, + 0.012107271701097488, + 0.011687545105814934, + 0.011282367631793022, + 0.011239093728363514, + 0.011319883167743683, + 0.011401253752410412, + 0.011270462535321712, + 0.010874134488403797, + 0.010491743683815002, + 0.010094426572322845, + 0.009496673010289669, + 0.008934317156672478, + 0.007476428989320993, + 0.00800084974616766, + 0.008607770316302776, + 0.009260729886591434, + 0.009903385303914547, + 0.010496539063751698, + 0.01112521905452013, + 0.011413856409490108, + 0.011514709331095219, + 0.011616453528404236, + 0.012089034542441368, + 0.012624196708202362, + 0.013209681026637554, + 0.014017689041793346, + 0.014875118620693684, + 0.015668896958231926, + 0.016265420243144035, + 0.01688465289771557, + 0.01793767511844635, + 0.019452175125479698, + 0.0210945475846529, + 0.02228682115674019, + 0.023294219747185707, + 0.024347150698304176, + 0.026011867448687553, + 0.02788165956735611, + 0.0298758614808321, + 0.03137143701314926, + 0.03294187784194946, + 0.034624479711055756, + 0.03659918159246445, + 0.03868650645017624, + 0.041140951216220856, + 0.044508930295705795, + 0.0481526255607605, + 0.051509227603673935, + 0.053995437920093536, + 0.056601643562316895, + 0.06005261838436127, + 0.06469986587762833, + 0.0697067454457283, + 0.07419613003730774, + 0.07804010063409805, + 0.08208322525024414, + 0.08549655228853226, + 0.08835137635469437, + 0.09130152314901352, + 0.09232597798109055, + 0.09193458408117294, + 0.09154483675956726, + 0.0897778794169426, + 0.08715377002954483, + 0.0846063643693924, + 0.0800614058971405, + 0.07446975260972977, + 0.06926863640546799, + 0.06500659883022308, + 0.061402495950460434, + 0.05799821391701698, + 0.05635717138648033, + 0.0560820996761322, + 0.05580836534500122, + 0.05410895496606827, + 0.05106201395392418, + 0.04818664863705635, + 0.045787207782268524, + 0.04392183944582939, + 0.04213246703147888, + 0.040549639612436295, + 0.0392850823700428, + 0.03805995732545853, + 0.0368521548807621, + 0.03561441972851753, + 0.0344182513654232, + 0.033258724957704544, + 0.032109443098306656, + 0.03099987469613552, + 0.029928646981716156, + 0.030013572424650192, + 0.030138883739709854, + 0.0302647165954113, + 0.029448598623275757, + 0.02844151481986046, + 0.027468867599964142, + 0.026475626975297928, + 0.025488262996077538, + 0.024537721648812294, + 0.02365281619131565, + 0.022836929187178612, + 0.0220491886138916, + 0.021302442997694016, + 0.020626146346330643, + 0.019971318542957306, + 0.019337281584739685, + 0.01875423453748226, + 0.01818879507482052, + 0.017640404403209686, + 0.017021074891090393, + 0.016395671293139458, + 0.015793249011039734, + 0.015222346410155296, + 0.01468166708946228, + 0.014160193502902985, + 0.01364597026258707, + 0.01310739852488041, + 0.012590083293616772, + 0.01209318544715643, + 0.011796820908784866, + 0.01152784377336502, + 0.011264998465776443, + 0.010905962437391281, + 0.010486410930752754, + 0.010083000175654888, + 0.006696108728647232, + 0.007169450633227825, + 0.007554955314844847, + 0.007961188443005085, + 0.008191961795091629, + 0.008392220363020897, + 0.008623906411230564, + 0.009105206467211246, + 0.009613366797566414, + 0.010063042864203453, + 0.010363757610321045, + 0.010673457756638527, + 0.01135565061122179, + 0.012377087958157063, + 0.013490401208400726, + 0.014293142594397068, + 0.015027140267193317, + 0.01579883135855198, + 0.016248296946287155, + 0.016703935340046883, + 0.017266079783439636, + 0.018352732062339783, + 0.019507773220539093, + 0.020772751420736313, + 0.022201264277100563, + 0.023728011175990105, + 0.025333672761917114, + 0.027017468586564064, + 0.028813177719712257, + 0.030508093535900116, + 0.03215433284640312, + 0.03388940170407295, + 0.036707766354084015, + 0.040172286331653595, + 0.04396379366517067, + 0.04676177352666855, + 0.049441445618867874, + 0.052274685353040695, + 0.0552951954305172, + 0.05849282070994377, + 0.0618753582239151, + 0.06342890113592148, + 0.06497602164745331, + 0.06655066460371017, + 0.06781809777021408, + 0.06910967081785202, + 0.07056038826704025, + 0.07409095019102097, + 0.07779816538095474, + 0.08131511509418488, + 0.08068443089723587, + 0.08005863428115845, + 0.07931673526763916, + 0.07725847512483597, + 0.07525362819433212, + 0.07328461110591888, + 0.07114551961421967, + 0.06906886398792267, + 0.06706785410642624, + 0.06554949283599854, + 0.06406551599502563, + 0.06261512637138367, + 0.06163647398352623, + 0.060680508613586426, + 0.0597393624484539, + 0.05608224496245384, + 0.052419863641262054, + 0.04899664968252182, + 0.04802362620830536, + 0.04752540960907936, + 0.04703236371278763, + 0.04535717889666557, + 0.0433243103325367, + 0.0413825586438179, + 0.040262095630168915, + 0.03963584452867508, + 0.03901933133602142, + 0.03826373070478439, + 0.03736088424921036, + 0.036479342728853226, + 0.035483237355947495, + 0.034233808517456055, + 0.03302836790680885, + 0.0318615548312664, + 0.03071431815624237, + 0.029608391225337982, + 0.028542283922433853, + 0.02809574455022812, + 0.027683310210704803, + 0.02727692946791649, + 0.02624664269387722, + 0.025052988901734352, + 0.02391362003982067, + 0.023070145398378372, + 0.02247576229274273, + 0.021896695718169212, + 0.02118198573589325, + 0.020112697035074234, + 0.019097385928034782, + 0.018132474273443222, + 0.017153022810816765, + 0.016226477921009064, + 0.015349982306361198, + 0.014748125337064266, + 0.014250957407057285, + 0.01377055048942566, + 0.013209998607635498, + 0.012551512569189072, + 0.011925849132239819, + 0.011351381428539753, + 0.010955261997878551, + 0.010572964325547218, + 0.010204007849097252, + 0.003847774351015687, + 0.004063574131578207, + 0.004316915292292833, + 0.0045860507525503635, + 0.004643903113901615, + 0.00460532633587718, + 0.004567069932818413, + 0.004720561672002077, + 0.004888801835477352, + 0.005062578245997429, + 0.005240594502538443, + 0.005424871575087309, + 0.005615833215415478, + 0.005813805852085352, + 0.006018757354468107, + 0.0062696486711502075, + 0.0065542105585336685, + 0.006851688027381897, + 0.007242816966027021, + 0.0076735555194318295, + 0.008127083070576191, + 0.008351907134056091, + 0.008582951501011848, + 0.008823424577713013, + 0.009085331112146378, + 0.009355011396110058, + 0.009728814475238323, + 0.01032988354563713, + 0.01096808910369873, + 0.01152480486780405, + 0.011959556490182877, + 0.012410708703100681, + 0.013203918002545834, + 0.01431323867291212, + 0.015515761449933052, + 0.01618284359574318, + 0.016561804339289665, + 0.016949638724327087, + 0.017497500404715538, + 0.01811426877975464, + 0.018752779811620712, + 0.019762806594371796, + 0.020908579230308533, + 0.022120779380202293, + 0.023094629868865013, + 0.02406386099755764, + 0.025073770433664322, + 0.025846702978014946, + 0.02661312185227871, + 0.02740226686000824, + 0.028928257524967194, + 0.030604707077145576, + 0.03237830847501755, + 0.03384844586253166, + 0.03534913808107376, + 0.03691636770963669, + 0.03809523582458496, + 0.03926195576786995, + 0.040464404970407486, + 0.04169943556189537, + 0.04297150671482086, + 0.04428238049149513, + 0.045805782079696655, + 0.047421082854270935, + 0.0490933433175087, + 0.05020410940051079, + 0.05113128572702408, + 0.0520755834877491, + 0.053777169436216354, + 0.05592251941561699, + 0.058153457939624786, + 0.060166552662849426, + 0.06200353428721428, + 0.06389660388231277, + 0.0652737021446228, + 0.06594807654619217, + 0.06662942469120026, + 0.06777551025152206, + 0.0700187161564827, + 0.07233615964651108, + 0.07456303387880325, + 0.07587660104036331, + 0.07721331715583801, + 0.0785735696554184, + 0.07814226299524307, + 0.07766743749380112, + 0.07719549536705017, + 0.07662377506494522, + 0.07602816820144653, + 0.07543718069791794, + 0.07395549863576889, + 0.07185877114534378, + 0.06982146948575974, + 0.06844346970319748, + 0.06821798533201218, + 0.06799324601888657, + 0.06733953207731247, + 0.063023641705513, + 0.05898435786366463, + 0.055203959345817566, + 0.052003465592861176, + 0.04905063658952713, + 0.04626546800136566, + 0.04402877017855644, + 0.04220069199800491, + 0.04044851288199425, + 0.03835039585828781, + 0.03521956130862236, + 0.03234431892633438, + 0.029703808948397636, + 0.028353435918688774, + 0.027137883007526398, + 0.025974443182349205, + 0.0050694760866463184, + 0.005233278963714838, + 0.005680937319993973, + 0.006171621382236481, + 0.006597811356186867, + 0.006731492467224598, + 0.006867882329970598, + 0.007007951382547617, + 0.007151769008487463, + 0.0072985379956662655, + 0.007458077743649483, + 0.007624403107911348, + 0.007794437929987907, + 0.007957902736961842, + 0.008124538697302341, + 0.00834851898252964, + 0.008826633915305138, + 0.009332130663096905, + 0.009849087335169315, + 0.01036441046744585, + 0.010906695388257504, + 0.011437654495239258, + 0.011961265467107296, + 0.012508846819400787, + 0.012927811592817307, + 0.013298639096319675, + 0.013680101372301579, + 0.014181623235344887, + 0.014719652011990547, + 0.015278092585504055, + 0.016291644424200058, + 0.017376307398080826, + 0.018464572727680206, + 0.019009917974472046, + 0.019571371376514435, + 0.020200541242957115, + 0.02106001414358616, + 0.021956058219075203, + 0.022797629237174988, + 0.023428764194250107, + 0.02407737448811531, + 0.02496553212404251, + 0.026325654238462448, + 0.02775987796485424, + 0.02922847494482994, + 0.03070399910211563, + 0.03225401043891907, + 0.03339206427335739, + 0.03389448672533035, + 0.03440447151660919, + 0.03572385013103485, + 0.03818630427122116, + 0.040818486362695694, + 0.04277144744992256, + 0.04367802292108536, + 0.04460381716489792, + 0.04524732008576393, + 0.045474372804164886, + 0.04570256173610687, + 0.046274613589048386, + 0.04742608219385147, + 0.04860620200634003, + 0.050051312893629074, + 0.05204463750123978, + 0.054117344319820404, + 0.05557158589363098, + 0.055013056844472885, + 0.05446013808250427, + 0.054352015256881714, + 0.05648950859904289, + 0.058711063116788864, + 0.06083887442946434, + 0.060222823172807693, + 0.05961301177740097, + 0.0590093769133091, + 0.06018999218940735, + 0.06151661276817322, + 0.06287247687578201, + 0.06266920268535614, + 0.062069203704595566, + 0.06147494912147522, + 0.06308553367853165, + 0.06605280190706253, + 0.06915964186191559, + 0.06971188634634018, + 0.0672260969877243, + 0.06482894718647003, + 0.06320886313915253, + 0.06351175159215927, + 0.06381608545780182, + 0.06399441510438919, + 0.06203366443514824, + 0.06013299897313118, + 0.05829055979847908, + 0.056838490068912506, + 0.05549187958240509, + 0.0541771724820137, + 0.051741160452365875, + 0.04862134903669357, + 0.045689649879932404, + 0.04348916560411453, + 0.04259631782770157, + 0.041721802204847336, + 0.040835101157426834, + 0.038798391819000244, + 0.03686327114701271, + 0.03502466529607773, + 0.03403767943382263, + 0.03336960822343826, + 0.03271465003490448, + 0.031099237501621246, + 0.02821681834757328, + 0.025601552799344063, + 0.006255262531340122, + 0.006466721184551716, + 0.006673842202872038, + 0.006879843771457672, + 0.0070922039449214935, + 0.007452004123479128, + 0.007851825095713139, + 0.008237895555794239, + 0.008392074145376682, + 0.008549138903617859, + 0.008750434964895248, + 0.009030668064951897, + 0.00931987538933754, + 0.00963149406015873, + 0.009963111951947212, + 0.01030614785850048, + 0.010651171207427979, + 0.011005103588104248, + 0.011370797641575336, + 0.011795430444180965, + 0.012236690148711205, + 0.012719239108264446, + 0.013357352465391159, + 0.014027480967342854, + 0.014704832807183266, + 0.015355918556451797, + 0.016035830602049828, + 0.01672378182411194, + 0.017414476722478867, + 0.018133698031306267, + 0.019111739471554756, + 0.02031274326145649, + 0.021589219570159912, + 0.022547289729118347, + 0.02337157353758812, + 0.024225989356637, + 0.025084543973207474, + 0.025966273620724678, + 0.026878995820879936, + 0.027952255681157112, + 0.029087912291288376, + 0.03026970848441124, + 0.0314222052693367, + 0.032612960785627365, + 0.033848837018013, + 0.03511269763112068, + 0.036423344165086746, + 0.037781234830617905, + 0.03897794336080551, + 0.04021255299448967, + 0.041487958282232285, + 0.042889781296253204, + 0.044338975101709366, + 0.04584335535764694, + 0.047829169780015945, + 0.04990100488066673, + 0.052062589675188065, + 0.05284892022609711, + 0.053636424243450165, + 0.05443565919995308, + 0.055505625903606415, + 0.05660945922136307, + 0.057735249400138855, + 0.058977171778678894, + 0.060256749391555786, + 0.061564087867736816, + 0.06167670711874962, + 0.06153115630149841, + 0.06138594448566437, + 0.06248883903026581, + 0.06407970935106277, + 0.06571108847856522, + 0.0653611496090889, + 0.0638359785079956, + 0.06234639137983322, + 0.061851512640714645, + 0.06232983246445656, + 0.06281185150146484, + 0.06253340095281601, + 0.06090432405471802, + 0.059317681938409805, + 0.057992979884147644, + 0.05759596452116966, + 0.05720166116952896, + 0.056809086352586746, + 0.05636117234826088, + 0.05591679364442825, + 0.05547591671347618, + 0.054102107882499695, + 0.05256335437297821, + 0.05106836557388306, + 0.04983004182577133, + 0.04875882714986801, + 0.047710634768009186, + 0.0463411770761013, + 0.04445233941078186, + 0.04264049232006073, + 0.0409078411757946, + 0.03928295895457268, + 0.037722617387771606, + 0.036224257200956345, + 0.0349515862762928, + 0.03375173732638359, + 0.032593075186014175, + 0.031373098492622375, + 0.03012355975806713, + 0.02892378531396389, + 0.027781525626778603, + 0.026711424812674522, + 0.025682540610432625, + 0.024693287909030914, + 0.02332213707268238, + 0.021998343989253044, + 0.007780587300658226, + 0.007864817045629025, + 0.008000418543815613, + 0.008270981721580029, + 0.008550694212317467, + 0.008882055059075356, + 0.009262514300644398, + 0.009659270755946636, + 0.00976102240383625, + 0.009786523878574371, + 0.00983060896396637, + 0.010385883040726185, + 0.0109725221991539, + 0.011506075970828533, + 0.01180732436478138, + 0.01211645919829607, + 0.012664762325584888, + 0.013525535352528095, + 0.014444813132286072, + 0.014968840405344963, + 0.01526283472776413, + 0.015562603250145912, + 0.016105065122246742, + 0.016719363629817963, + 0.01735709235072136, + 0.01765999011695385, + 0.0179611649364233, + 0.018402544781565666, + 0.019878536462783813, + 0.021472912281751633, + 0.022853698581457138, + 0.02325068786740303, + 0.023654570803046227, + 0.024299457669258118, + 0.025401940569281578, + 0.026554444804787636, + 0.02807622216641903, + 0.03010166622698307, + 0.032273225486278534, + 0.03383401036262512, + 0.03475857898592949, + 0.03570840507745743, + 0.036375436931848526, + 0.036833506077528, + 0.03729734197258949, + 0.038952168077230453, + 0.04143073782324791, + 0.04406702145934105, + 0.045452989637851715, + 0.04612942039966583, + 0.046815916895866394, + 0.04857674986124039, + 0.050970371812582016, + 0.053481943905353546, + 0.05459859222173691, + 0.054947689175605774, + 0.05529901012778282, + 0.056542422622442245, + 0.058346834033727646, + 0.06020882725715637, + 0.06119813770055771, + 0.06156009063124657, + 0.06192418187856674, + 0.06231961026787758, + 0.06274319440126419, + 0.06316967308521271, + 0.0637178048491478, + 0.06441234052181244, + 0.06511444598436356, + 0.0654866024851799, + 0.06527666002511978, + 0.06506739556789398, + 0.06455715000629425, + 0.06318757683038712, + 0.06184706091880798, + 0.06049249693751335, + 0.05888502672314644, + 0.05732027441263199, + 0.05579710379242897, + 0.055724870413541794, + 0.05567815899848938, + 0.05563148856163025, + 0.05452326685190201, + 0.053210437297821045, + 0.05192921683192253, + 0.050132714211940765, + 0.048102229833602905, + 0.04615398496389389, + 0.04442891106009483, + 0.04294607415795326, + 0.04151272773742676, + 0.04013964161276817, + 0.038853954523801804, + 0.03760945424437523, + 0.0364048145711422, + 0.03539382666349411, + 0.03441283851861954, + 0.03345904126763344, + 0.03243463858962059, + 0.03140760585665703, + 0.030413096770644188, + 0.029460053890943527, + 0.028548112139105797, + 0.02766440249979496, + 0.026685897260904312, + 0.025183770805597305, + 0.02376619540154934, + 0.022428413853049278, + 0.021658623591065407, + 0.02099129557609558, + 0.020344527438282967, + 0.019628986716270447, + 0.018864968791604042, + 0.007801692467182875, + 0.00819752924144268, + 0.008610637858510017, + 0.00887185987085104, + 0.009141006506979465, + 0.009361711330711842, + 0.009441819041967392, + 0.00952261220663786, + 0.009856635704636574, + 0.01043775212019682, + 0.01105312816798687, + 0.011345110833644867, + 0.011534834280610085, + 0.011727729812264442, + 0.012485596351325512, + 0.013301226310431957, + 0.014043397270143032, + 0.014266841113567352, + 0.014493841677904129, + 0.01486121118068695, + 0.015472747385501862, + 0.016109447926282883, + 0.016679855063557625, + 0.017191994935274124, + 0.01771986111998558, + 0.01849142089486122, + 0.0193971935659647, + 0.020347336307168007, + 0.02133193053305149, + 0.02236182801425457, + 0.02344144508242607, + 0.024071048945188522, + 0.024700427427887917, + 0.02539587765932083, + 0.026749785989522934, + 0.028175873681902885, + 0.029608961194753647, + 0.03075278550386429, + 0.03194079548120499, + 0.033344585448503494, + 0.03537594527006149, + 0.0375310555100441, + 0.039297353476285934, + 0.03989638015627861, + 0.040504537522792816, + 0.041722964495420456, + 0.044203564524650574, + 0.0468316487967968, + 0.04909072816371918, + 0.05051574483513832, + 0.051982127130031586, + 0.05345964804291725, + 0.05492496117949486, + 0.05643044412136078, + 0.05834253504872322, + 0.060983192175626755, + 0.06374337524175644, + 0.06598811596632004, + 0.06703755259513855, + 0.06810367107391357, + 0.06898151338100433, + 0.0693792998790741, + 0.06977938115596771, + 0.07035685330629349, + 0.07151245325803757, + 0.07268702983856201, + 0.0736987367272377, + 0.07375685125589371, + 0.0738150104880333, + 0.07374244183301926, + 0.07180780917406082, + 0.06992393732070923, + 0.06808948516845703, + 0.06610962003469467, + 0.06417803466320038, + 0.062302879989147186, + 0.06104201078414917, + 0.059924982488155365, + 0.058828387409448624, + 0.05627347156405449, + 0.053165141493082047, + 0.05022850260138512, + 0.047781869769096375, + 0.04575444012880325, + 0.04381303861737251, + 0.0417812317609787, + 0.039509117603302, + 0.03736056387424469, + 0.035383500158786774, + 0.03386588767170906, + 0.032413363456726074, + 0.031023137271404266, + 0.029928160831332207, + 0.02889462187886238, + 0.02789677493274212, + 0.026920799165964127, + 0.02597305364906788, + 0.025058669969439507, + 0.02405497618019581, + 0.022929595783352852, + 0.021856864914298058, + 0.020904190838336945, + 0.02039533108472824, + 0.019898857921361923, + 0.019414467737078667, + 0.018992630764842033, + 0.018588600680232048, + 0.018193164840340614, + 0.0177739467471838, + 0.017337806522846222, + 0.016912367194890976, + 0.016378402709960938, + 0.015441320836544037, + 0.006929364055395126, + 0.006906029302626848, + 0.006882773246616125, + 0.00725807948037982, + 0.007755564991384745, + 0.00826950278133154, + 0.008588209748268127, + 0.00891919992864132, + 0.009143789298832417, + 0.00912395864725113, + 0.0091041699051857, + 0.00937066599726677, + 0.009885693900287151, + 0.01042902935296297, + 0.010798348113894463, + 0.011120198294520378, + 0.011451641097664833, + 0.011797155253589153, + 0.012153194285929203, + 0.012578320689499378, + 0.013331652618944645, + 0.014130101539194584, + 0.014817596413195133, + 0.015211774967610836, + 0.015616439282894135, + 0.016735559329390526, + 0.018759941682219505, + 0.021029196679592133, + 0.02173667959868908, + 0.021409913897514343, + 0.02108806185424328, + 0.022016780450940132, + 0.023438412696123123, + 0.024951841682195663, + 0.026027893647551537, + 0.027057219296693802, + 0.02812725305557251, + 0.029237521812319756, + 0.03039149008691311, + 0.03160041943192482, + 0.03337288647890091, + 0.03524477034807205, + 0.037177830934524536, + 0.038657285273075104, + 0.040195610374212265, + 0.041686367243528366, + 0.0423830971121788, + 0.04309146851301193, + 0.04412183165550232, + 0.04718263819813728, + 0.05045578256249428, + 0.05380041152238846, + 0.05641030892729759, + 0.05914681777358055, + 0.06220037490129471, + 0.06665033847093582, + 0.0714186504483223, + 0.07616588473320007, + 0.07815742492675781, + 0.08020105212926865, + 0.08227765560150146, + 0.08410964161157608, + 0.08598241955041885, + 0.08788835257291794, + 0.08787469565868378, + 0.08786104619503021, + 0.08784740418195724, + 0.08791325241327286, + 0.08798553049564362, + 0.08805786073207855, + 0.08584987372159958, + 0.08324943482875824, + 0.08072777092456818, + 0.0778430923819542, + 0.07489482313394547, + 0.07205820083618164, + 0.0672903060913086, + 0.06152690201997757, + 0.056257136166095734, + 0.05257958546280861, + 0.05054771900177002, + 0.04859437048435211, + 0.04604574665427208, + 0.04196916148066521, + 0.03825348615646362, + 0.03503509983420372, + 0.033744148910045624, + 0.03250076249241829, + 0.03130319342017174, + 0.0286078080534935, + 0.025967327877879143, + 0.023570559918880463, + 0.02204938232898712, + 0.02094150334596634, + 0.019889293238520622, + 0.01884867250919342, + 0.01781013049185276, + 0.016828812658786774, + 0.01604037545621395, + 0.01594909466803074, + 0.015858333557844162, + 0.01576809026300907, + 0.014797027222812176, + 0.013792539946734905, + 0.012856243178248405, + 0.012298795394599438, + 0.011968919076025486, + 0.011647889390587807, + 0.011273651383817196, + 0.010766725055873394, + 0.010282594710588455, + 0.009820232167840004, + 0.009721076115965843, + 0.004809823352843523, + 0.005014714784920216, + 0.0052283331751823425, + 0.005376611836254597, + 0.005490603856742382, + 0.005607012193650007, + 0.0057407463900744915, + 0.005878876894712448, + 0.006042079534381628, + 0.006316498387604952, + 0.006603380665183067, + 0.006896280683577061, + 0.007191529497504234, + 0.007499418221414089, + 0.007711571641266346, + 0.007863064296543598, + 0.008017533458769321, + 0.008371620438992977, + 0.008785352110862732, + 0.0092210303992033, + 0.009820212610065937, + 0.010458329692482948, + 0.01108159963041544, + 0.011475172825157642, + 0.011882724240422249, + 0.012433000840246677, + 0.013280116021633148, + 0.014184948056936264, + 0.014914922416210175, + 0.015408854931592941, + 0.015919145196676254, + 0.0169366504997015, + 0.01838543266057968, + 0.019958142191171646, + 0.020617039874196053, + 0.020847070962190628, + 0.021079668775200844, + 0.02204989455640316, + 0.02327653393149376, + 0.024571411311626434, + 0.025790363550186157, + 0.02704462967813015, + 0.028359895572066307, + 0.029680345207452774, + 0.031056661158800125, + 0.032496798783540726, + 0.03514743596315384, + 0.03807257488369942, + 0.04124116152524948, + 0.04413973540067673, + 0.047229502350091934, + 0.05053555220365524, + 0.05614560469985008, + 0.06241567060351372, + 0.06938594579696655, + 0.07432876527309418, + 0.07954329997301102, + 0.08512365818023682, + 0.09127262979745865, + 0.09787671267986298, + 0.10495864599943161, + 0.10909422487020493, + 0.11300284415483475, + 0.11705149710178375, + 0.11885154992341995, + 0.12021671235561371, + 0.12159755080938339, + 0.11821555346250534, + 0.11349155008792877, + 0.10895632952451706, + 0.10399798303842545, + 0.09897250682115555, + 0.09418988227844238, + 0.08920113742351532, + 0.08413682132959366, + 0.07936003804206848, + 0.07322502136230469, + 0.06551188230514526, + 0.05861121043562889, + 0.05244847387075424, + 0.04696091637015343, + 0.04204750433564186, + 0.03772760182619095, + 0.034501124173402786, + 0.0315505750477314, + 0.02885235659778118, + 0.026185069233179092, + 0.023747537285089493, + 0.02153691276907921, + 0.019967444241046906, + 0.018678318709135056, + 0.01747242361307144, + 0.016094349324703217, + 0.014589664526283741, + 0.013225654140114784, + 0.01215826440602541, + 0.01165272481739521, + 0.011168204247951508, + 0.010703830979764462, + 0.01032757293432951, + 0.009964938275516033, + 0.009615037590265274, + 0.009322255849838257, + 0.00905549619346857, + 0.008796371519565582, + 0.008385811001062393, + 0.007793155498802662, + 0.007242383901029825, + 0.006762668490409851, + 0.006559956353157759, + 0.006363321095705032, + 0.00617257971316576, + 0.005995139013975859, + 0.004205904435366392, + 0.004347433801740408, + 0.004493726417422295, + 0.004620156716555357, + 0.004731364548206329, + 0.004845249932259321, + 0.00510492455214262, + 0.005408237688243389, + 0.005721851717680693, + 0.005966634955257177, + 0.006221890449523926, + 0.006438113283365965, + 0.006551970262080431, + 0.0066678402945399284, + 0.006963860243558884, + 0.007439515087753534, + 0.007947657257318497, + 0.008309226483106613, + 0.008619734086096287, + 0.00894184596836567, + 0.009324362501502037, + 0.00972767174243927, + 0.010140408761799335, + 0.010485081933438778, + 0.010841471143066883, + 0.01121168490499258, + 0.011600092984735966, + 0.012001956813037395, + 0.012499022297561169, + 0.013156640343368053, + 0.013848858885467052, + 0.014701231382787228, + 0.015738595277071, + 0.016849162057042122, + 0.017995167523622513, + 0.019189195707440376, + 0.020462453365325928, + 0.021033382043242455, + 0.02127131260931492, + 0.02151193469762802, + 0.022328948602080345, + 0.023363064974546432, + 0.024445071816444397, + 0.02593211457133293, + 0.027592679485678673, + 0.029359575361013412, + 0.03131377696990967, + 0.03341100364923477, + 0.035648688673973083, + 0.03858951851725578, + 0.04185406491160393, + 0.045394785702228546, + 0.049925848841667175, + 0.0550067313015461, + 0.06060469150543213, + 0.06827093660831451, + 0.07715000212192535, + 0.08718384057283401, + 0.09703145176172256, + 0.10769448429346085, + 0.11952929943799973, + 0.1276383250951767, + 0.13500043749809265, + 0.14278720319271088, + 0.1444201022386551, + 0.14378219842910767, + 0.14314711093902588, + 0.13835977017879486, + 0.13170024752616882, + 0.12536127865314484, + 0.1160794273018837, + 0.10519441962242126, + 0.0953301191329956, + 0.08781810849905014, + 0.08255565911531448, + 0.07760857045650482, + 0.07141099870204926, + 0.06270977109670639, + 0.05506875365972519, + 0.048433784395456314, + 0.04293478652834892, + 0.03806012496352196, + 0.03373891860246658, + 0.029931122437119484, + 0.026553140953183174, + 0.02355639450252056, + 0.02099294774234295, + 0.018728243187069893, + 0.016707852482795715, + 0.01524033397436142, + 0.014102628454566002, + 0.013049854896962643, + 0.012104939669370651, + 0.01127177570015192, + 0.010495956987142563, + 0.009794257581233978, + 0.009253252297639847, + 0.008742131292819977, + 0.00825924426317215, + 0.007918543182313442, + 0.00760596664622426, + 0.007305727805942297, + 0.00706005422398448, + 0.006848975084722042, + 0.0066442061215639114, + 0.006420840043574572, + 0.006153778173029423, + 0.005897824186831713, + 0.005652474705129862, + 0.005405625328421593, + 0.005169556941837072, + 0.004943797364830971, + 0.0047680167481303215, + 0.006913059391081333, + 0.007161944173276424, + 0.0074197896756231785, + 0.007694113068282604, + 0.007984810508787632, + 0.008286491967737675, + 0.008528529666364193, + 0.008760342374444008, + 0.009000042453408241, + 0.009274152107536793, + 0.009556610137224197, + 0.009898555465042591, + 0.01038468535989523, + 0.010894691571593285, + 0.011349784210324287, + 0.01174233015626669, + 0.012148452922701836, + 0.01265359204262495, + 0.013217099010944366, + 0.013805701397359371, + 0.014389943331480026, + 0.014994936995208263, + 0.015646282583475113, + 0.01668521761894226, + 0.017793137580156326, + 0.018865181133151054, + 0.019573494791984558, + 0.02030840329825878, + 0.02098526433110237, + 0.021519726142287254, + 0.022067800164222717, + 0.02266363613307476, + 0.023314982652664185, + 0.02398504503071308, + 0.025216231122612953, + 0.026942940428853035, + 0.028787890449166298, + 0.030161164700984955, + 0.03128393739461899, + 0.032448507845401764, + 0.0332149863243103, + 0.03383663669228554, + 0.03446992114186287, + 0.03594314306974411, + 0.03771427646279335, + 0.039572689682245255, + 0.04076315090060234, + 0.04182793200016022, + 0.04292052611708641, + 0.04530142992734909, + 0.04805431514978409, + 0.05097449570894241, + 0.05453721433877945, + 0.05843407288193703, + 0.06260937452316284, + 0.0669531598687172, + 0.0715724527835846, + 0.07651044428348541, + 0.08085864037275314, + 0.08523119240999222, + 0.08984020352363586, + 0.09407629072666168, + 0.0983167439699173, + 0.10274834930896759, + 0.10472764074802399, + 0.10563751310110092, + 0.10655529052019119, + 0.10494855046272278, + 0.10190127044916153, + 0.09894247353076935, + 0.09523940086364746, + 0.09096655249595642, + 0.08688540756702423, + 0.0830327570438385, + 0.07941262423992157, + 0.07595031708478928, + 0.07097640633583069, + 0.06250446289777756, + 0.05504374951124191, + 0.04867362603545189, + 0.044239554554224014, + 0.040209416300058365, + 0.036546412855386734, + 0.03318096324801445, + 0.030124152079224586, + 0.027348950505256653, + 0.025044921785593033, + 0.022992072626948357, + 0.021107491105794907, + 0.019499002024531364, + 0.01809731125831604, + 0.016796382144093513, + 0.01581278257071972, + 0.015284355729818344, + 0.014773586764931679, + 0.014241242781281471, + 0.01343339029699564, + 0.012671364471316338, + 0.011952565051615238, + 0.011447923257946968, + 0.010993514209985733, + 0.010557142086327076, + 0.010289357975125313, + 0.010138217359781265, + 0.009989297948777676, + 0.009810163639485836, + 0.00955332349985838, + 0.009303209371864796, + 0.009059642441570759, + 0.00842207483947277, + 0.007817139849066734, + 0.007255656644701958, + 0.0069515276700258255, + 0.008875740692019463, + 0.009266648441553116, + 0.009674771688878536, + 0.010113749653100967, + 0.01058262586593628, + 0.011073240078985691, + 0.011530883610248566, + 0.011996224522590637, + 0.012509869411587715, + 0.013380713760852814, + 0.014312179759144783, + 0.015075202099978924, + 0.01536275539547205, + 0.015655795112252235, + 0.016134414821863174, + 0.01679142750799656, + 0.017475195229053497, + 0.01821674220263958, + 0.019001049920916557, + 0.019819125533103943, + 0.021144183352589607, + 0.022602440789341927, + 0.02407570742070675, + 0.02472601644694805, + 0.02539389207959175, + 0.026244912296533585, + 0.027666710317134857, + 0.029165534302592278, + 0.030580949038267136, + 0.03178410232067108, + 0.03303459659218788, + 0.034213174134492874, + 0.03530874475836754, + 0.03643940016627312, + 0.03802473843097687, + 0.03996730223298073, + 0.04200910031795502, + 0.04340940713882446, + 0.04451913759112358, + 0.045657236129045486, + 0.04711645841598511, + 0.04871528223156929, + 0.050368357449769974, + 0.05211108550429344, + 0.05392171069979668, + 0.05579524487257004, + 0.056478142738342285, + 0.05696412920951843, + 0.05745429918169975, + 0.05885973200201988, + 0.060426048934459686, + 0.06203404814004898, + 0.06460609287023544, + 0.0674080103635788, + 0.07033144682645798, + 0.07129843533039093, + 0.07198337465524673, + 0.07267489284276962, + 0.0737702026963234, + 0.07495502382516861, + 0.07615888863801956, + 0.07595714926719666, + 0.07540819048881531, + 0.07486318796873093, + 0.07439114153385162, + 0.07394631952047348, + 0.07350415736436844, + 0.07281823456287384, + 0.07201269268989563, + 0.07121606916189194, + 0.06913059949874878, + 0.06613919138908386, + 0.0632772147655487, + 0.060030899941921234, + 0.05635996162891388, + 0.05291350558400154, + 0.0496411994099617, + 0.046496499329805374, + 0.0435510128736496, + 0.04069606214761734, + 0.037575747817754745, + 0.03469467908143997, + 0.032034508883953094, + 0.02962419018149376, + 0.02739536389708519, + 0.025334225967526436, + 0.02385874278843403, + 0.02256464771926403, + 0.021340742707252502, + 0.020105205476284027, + 0.018893886357545853, + 0.017755547538399696, + 0.016859225928783417, + 0.01627369038760662, + 0.01570848934352398, + 0.015150675550103188, + 0.014543862082064152, + 0.013961352407932281, + 0.013402175158262253, + 0.012791627086699009, + 0.012200051918625832, + 0.011635835282504559, + 0.011205630376935005, + 0.01085782889276743, + 0.010520821437239647, + 0.010204133577644825, + 0.00991762988269329, + 0.009639170952141285, + 0.009368372149765491, + 0.009059949778020382, + 0.008761679753661156, + 0.008473229594528675, + 0.00825022254139185, + 0.009920421056449413, + 0.01064892578870058, + 0.011430930346250534, + 0.011693558655679226, + 0.011673140339553356, + 0.011652756482362747, + 0.012358130887150764, + 0.013169179670512676, + 0.013949769549071789, + 0.014364966191351414, + 0.014792518690228462, + 0.015409576706588268, + 0.01632419042289257, + 0.017293090000748634, + 0.018414102494716644, + 0.019668670371174812, + 0.02100871317088604, + 0.022059869021177292, + 0.023080118000507355, + 0.02414715848863125, + 0.025226948782801628, + 0.026355018839240074, + 0.027667943388223648, + 0.029694892466068268, + 0.03187033534049988, + 0.034158866852521896, + 0.03651316836476326, + 0.03902972489595413, + 0.04123655706644058, + 0.043004073202610016, + 0.04484735429286957, + 0.04693425074219704, + 0.049236614257097244, + 0.05165191367268562, + 0.0541456937789917, + 0.05674180015921593, + 0.05946238338947296, + 0.06115339323878288, + 0.06257470697164536, + 0.06402906030416489, + 0.06599367409944534, + 0.06809870898723602, + 0.07027088850736618, + 0.07078435271978378, + 0.07114455848932266, + 0.07150660455226898, + 0.07186758518218994, + 0.0722302496433258, + 0.07259475439786911, + 0.07274841517210007, + 0.07289770245552063, + 0.07304730266332626, + 0.07488278299570084, + 0.07679211348295212, + 0.0787501335144043, + 0.07463990151882172, + 0.07059241086244583, + 0.06676439940929413, + 0.06546282768249512, + 0.06431999802589417, + 0.06319712847471237, + 0.061346422880887985, + 0.05947038158774376, + 0.05765170603990555, + 0.05559800937771797, + 0.05356364697217941, + 0.05160372704267502, + 0.049685873091220856, + 0.0478302463889122, + 0.04604392126202583, + 0.0450148768723011, + 0.04435701668262482, + 0.043708767741918564, + 0.04138210043311119, + 0.03790922462940216, + 0.0347278006374836, + 0.03227933123707771, + 0.030621249228715897, + 0.029048336669802666, + 0.027586806565523148, + 0.02627873234450817, + 0.025032682344317436, + 0.02388218604028225, + 0.023100756108760834, + 0.022344892844557762, + 0.02161376178264618, + 0.020035065710544586, + 0.01849815808236599, + 0.017079146578907967, + 0.016280939802527428, + 0.01572209969162941, + 0.01518244482576847, + 0.014858502894639969, + 0.014744499698281288, + 0.014631371945142746, + 0.014297318644821644, + 0.013345299288630486, + 0.012456671334803104, + 0.011627214960753918, + 0.011340104043483734, + 0.01106298342347145, + 0.010792635381221771, + 0.010440658777952194, + 0.010066872462630272, + 0.009706468321383, + 0.009365959092974663, + 0.00904657132923603, + 0.008738074451684952, + 0.008454988710582256, + 0.008297262713313103, + 0.008142479695379734, + 0.007990582846105099, + 0.007784809917211533, + 0.008567440323531628, + 0.009231491945683956, + 0.009947014041244984, + 0.010471939109265804, + 0.010964865796267986, + 0.011465669609606266, + 0.011793033219873905, + 0.01212974265217781, + 0.012758851051330566, + 0.014063726179301739, + 0.015502052381634712, + 0.01646468974649906, + 0.016978690400719643, + 0.017508739605545998, + 0.018294252455234528, + 0.01918809488415718, + 0.020125612616539, + 0.021443748846650124, + 0.02285662852227688, + 0.024348389357328415, + 0.02586020529270172, + 0.02746589295566082, + 0.029307836666703224, + 0.03156592696905136, + 0.03399799019098282, + 0.036568742245435715, + 0.039279114454984665, + 0.042190372943878174, + 0.04471258819103241, + 0.04700840637087822, + 0.04942210391163826, + 0.05312487855553627, + 0.05753004178404808, + 0.062300488352775574, + 0.06653686612844467, + 0.07089502364397049, + 0.07553863525390625, + 0.07966340333223343, + 0.08396352082490921, + 0.08841102570295334, + 0.08855176717042923, + 0.08869274705648422, + 0.08875484764575958, + 0.08785679936408997, + 0.0869678258895874, + 0.08612477034330368, + 0.08556865155696869, + 0.08501613140106201, + 0.08412596583366394, + 0.08119568228721619, + 0.0783674493432045, + 0.07553685456514359, + 0.07224482297897339, + 0.06909626722335815, + 0.0662144348025322, + 0.06424309313297272, + 0.062330447137355804, + 0.060306623578071594, + 0.057043783366680145, + 0.05395748093724251, + 0.051131054759025574, + 0.049724988639354706, + 0.048357587307691574, + 0.047021783888339996, + 0.04441501572728157, + 0.04195275530219078, + 0.03962700068950653, + 0.03792102634906769, + 0.0363263264298439, + 0.03479868918657303, + 0.03358250856399536, + 0.0324578694999218, + 0.031370896846055984, + 0.02998439595103264, + 0.028533339500427246, + 0.02715250663459301, + 0.025977017357945442, + 0.024946454912424088, + 0.0239567793905735, + 0.02296273410320282, + 0.021956302225589752, + 0.020993979647755623, + 0.020021650940179825, + 0.018961381167173386, + 0.017957257106900215, + 0.017032455652952194, + 0.016416801139712334, + 0.015823395922780037, + 0.015251442790031433, + 0.014901414513587952, + 0.014585087075829506, + 0.014275474473834038, + 0.013925471343100071, + 0.013561050407588482, + 0.01320616714656353, + 0.012795795686542988, + 0.012314447201788425, + 0.011851205490529537, + 0.011405025608837605, + 0.01097393874078989, + 0.010559146292507648, + 0.010160031728446484, + 0.009967769496142864, + 0.0098012899979949, + 0.009637591429054737, + 0.00930275022983551, + 0.008870461955666542, + 0.00845826230943203, + 0.008137253113090992, + 0.00800023227930069, + 0.00786552019417286, + 0.007733075879514217, + 0.007471365854144096, + 0.007622656878083944, + 0.008049599826335907, + 0.008500475436449051, + 0.008977964520454407, + 0.009482274763286114, + 0.01004777941852808, + 0.010736130177974701, + 0.011471637524664402, + 0.012143583036959171, + 0.012749810703098774, + 0.01338630449026823, + 0.014171565882861614, + 0.015040753409266472, + 0.015963248908519745, + 0.016753029078245163, + 0.01757904887199402, + 0.01848592609167099, + 0.019621526822447777, + 0.020826885476708412, + 0.022075483575463295, + 0.02334500662982464, + 0.024687539786100388, + 0.02618892677128315, + 0.02785314805805683, + 0.0296231247484684, + 0.03153897449374199, + 0.03359368443489075, + 0.03578225523233414, + 0.038924988359212875, + 0.042509112507104874, + 0.046423252671957016, + 0.05079018324613571, + 0.0555712915956974, + 0.060602158308029175, + 0.06344670057296753, + 0.06642476469278336, + 0.0698198452591896, + 0.07487126439809799, + 0.08028814941644669, + 0.08547239005565643, + 0.08892396092414856, + 0.09251491725444794, + 0.09579964727163315, + 0.09811290353536606, + 0.1004820168018341, + 0.10188703238964081, + 0.10133405774831772, + 0.10078409314155579, + 0.09906835108995438, + 0.09541704505681992, + 0.0919003039598465, + 0.08756192028522491, + 0.08192922174930573, + 0.07665886729955673, + 0.07188105583190918, + 0.06765253841876984, + 0.06367276608943939, + 0.06009332090616226, + 0.057022225111722946, + 0.054108086973428726, + 0.05099381506443024, + 0.047286227345466614, + 0.04384820535778999, + 0.041260454803705215, + 0.04070805758237839, + 0.040163055062294006, + 0.03934171795845032, + 0.03710281476378441, + 0.034991323947906494, + 0.033003415912389755, + 0.031175093725323677, + 0.02944805659353733, + 0.027816694229841232, + 0.026417924091219902, + 0.02509620413184166, + 0.023840608075261116, + 0.02313394658267498, + 0.0225507915019989, + 0.021982334554195404, + 0.021264037117362022, + 0.020493589341640472, + 0.019751057028770447, + 0.019008181989192963, + 0.018268223851919174, + 0.01755707338452339, + 0.016783835366368294, + 0.01587073877453804, + 0.015007316134870052, + 0.014258879236876965, + 0.013996433466672897, + 0.01373881846666336, + 0.01348594669252634, + 0.013310695998370647, + 0.01314493641257286, + 0.012981239706277847, + 0.012812662869691849, + 0.01264294981956482, + 0.012475483119487762, + 0.012203000485897064, + 0.011791530065238476, + 0.011393934488296509, + 0.01098643895238638, + 0.01046078186482191, + 0.009960275143384933, + 0.009483716450631618, + 0.009165877476334572, + 0.008881712332367897, + 0.008606359362602234, + 0.008345314301550388, + 0.008096931502223015, + 0.007855940610170364, + 0.007622163742780685, + 0.007395495194941759, + 0.006888792850077152, + 0.007181481458246708, + 0.00747705576941371, + 0.00775945046916604, + 0.008052511140704155, + 0.008475441485643387, + 0.009024925529956818, + 0.00961003452539444, + 0.010135091841220856, + 0.010663142427802086, + 0.011219452135264874, + 0.011825787834823132, + 0.01246489118784666, + 0.013086304068565369, + 0.01358100213110447, + 0.014094402082264423, + 0.01491943933069706, + 0.016161728650331497, + 0.017507459968328476, + 0.018922828137874603, + 0.02042802795767784, + 0.022052956745028496, + 0.022976268082857132, + 0.02375691384077072, + 0.02456408366560936, + 0.02652832306921482, + 0.02867380529642105, + 0.031039932742714882, + 0.03396979719400406, + 0.03717620670795441, + 0.0406719334423542, + 0.04445201903581619, + 0.04858342558145523, + 0.05300138145685196, + 0.057629622519016266, + 0.0626620203256607, + 0.06695154309272766, + 0.0700146034359932, + 0.07321780174970627, + 0.07761633396148682, + 0.08329689502716064, + 0.08939322084188461, + 0.0966925099492073, + 0.10517218708992004, + 0.11439551413059235, + 0.11954299360513687, + 0.12199762463569641, + 0.12450265139341354, + 0.12162624299526215, + 0.11611051857471466, + 0.11084494739770889, + 0.10362306237220764, + 0.09585234522819519, + 0.08866434544324875, + 0.08027607202529907, + 0.07187438756227493, + 0.06435202807188034, + 0.058503348380327225, + 0.05365810543298721, + 0.04921414703130722, + 0.046114422380924225, + 0.04385075345635414, + 0.04169820621609688, + 0.04025985673069954, + 0.039390817284584045, + 0.03854053467512131, + 0.036649107933044434, + 0.033698081970214844, + 0.030984682962298393, + 0.029190292581915855, + 0.02868206985294819, + 0.02818269282579422, + 0.02745177038013935, + 0.02607005462050438, + 0.024757884442806244, + 0.023516185581684113, + 0.022365465760231018, + 0.021271057426929474, + 0.02023020014166832, + 0.019610894843935966, + 0.019017010927200317, + 0.018441112712025642, + 0.01802435703575611, + 0.017647700384259224, + 0.01727891154587269, + 0.016741620376706123, + 0.016125112771987915, + 0.015531309880316257, + 0.015079185366630554, + 0.014789924956858158, + 0.014506213366985321, + 0.014192595146596432, + 0.013765585608780384, + 0.013351424597203732, + 0.012949722819030285, + 0.01244744285941124, + 0.011963272467255592, + 0.01149793528020382, + 0.01130438782274723, + 0.011205833405256271, + 0.011108138598501682, + 0.0110010402277112, + 0.010883179493248463, + 0.010766581632196903, + 0.010574179701507092, + 0.010029460303485394, + 0.009512800723314285, + 0.009022757411003113, + 0.008737292140722275, + 0.008488577790558338, + 0.008246943354606628, + 0.008087963797152042, + 0.007996832951903343, + 0.005755469668656588, + 0.006030993070453405, + 0.006426840554922819, + 0.006924502085894346, + 0.007460700813680887, + 0.007682777941226959, + 0.007859566248953342, + 0.008081772364675999, + 0.008609997108578682, + 0.009172746911644936, + 0.009695562534034252, + 0.010108263231813908, + 0.01053853239864111, + 0.011051539331674576, + 0.011637338437139988, + 0.01225418969988823, + 0.012894151732325554, + 0.013564911670982838, + 0.014270564541220665, + 0.015310495160520077, + 0.016431305557489395, + 0.017659328877925873, + 0.019122224301099777, + 0.020706307142972946, + 0.022240877151489258, + 0.023479457944631577, + 0.024787014350295067, + 0.026736095547676086, + 0.029569795355200768, + 0.03270383179187775, + 0.035863399505615234, + 0.03909529745578766, + 0.04261844605207443, + 0.04694457724690437, + 0.051940880715847015, + 0.057468947023153305, + 0.0631931945681572, + 0.06937648355960846, + 0.07616478949785233, + 0.0819263905286789, + 0.08786152303218842, + 0.09422662109136581, + 0.10433663427829742, + 0.1157909482717514, + 0.1285027265548706, + 0.13022153079509735, + 0.13171426951885223, + 0.13315346837043762, + 0.1261393278837204, + 0.11949466168880463, + 0.11311700940132141, + 0.1032743826508522, + 0.09428819268941879, + 0.08606277406215668, + 0.07727941125631332, + 0.06939245760440826, + 0.06231042370200157, + 0.05869438499212265, + 0.055307455360889435, + 0.052115969359874725, + 0.04816034063696861, + 0.04446284472942352, + 0.04104922339320183, + 0.03989744931459427, + 0.0390063039958477, + 0.03813505917787552, + 0.03621682524681091, + 0.03418273478746414, + 0.032262884080410004, + 0.03108428232371807, + 0.030173731967806816, + 0.029289858415722847, + 0.028094494715332985, + 0.026755761355161667, + 0.02548082172870636, + 0.024402549490332603, + 0.023501060903072357, + 0.02263287641108036, + 0.021670909598469734, + 0.020533785223960876, + 0.019456330686807632, + 0.018528994172811508, + 0.018018154427409172, + 0.01752140000462532, + 0.017042146995663643, + 0.01680086925625801, + 0.01656300574541092, + 0.016328511759638786, + 0.015933528542518616, + 0.015513124875724316, + 0.015103815123438835, + 0.014598839916288853, + 0.014043883420526981, + 0.013510024175047874, + 0.013157014735043049, + 0.013081834651529789, + 0.013007084839046001, + 0.012882578186690807, + 0.01240280270576477, + 0.011940895579755306, + 0.011496190913021564, + 0.01135864295065403, + 0.0112737026065588, + 0.011189398355782032, + 0.0107783954590559, + 0.010144445113837719, + 0.009547781199216843, + 0.009094296023249626, + 0.008967217989265919, + 0.008841916918754578, + 0.008718365803360939, + 0.008377577178180218, + 0.008034911938011646, + 0.008807354606688023, + 0.009213143028318882, + 0.009790030308067799, + 0.010405528359115124, + 0.011019612662494183, + 0.01154730748385191, + 0.012100272811949253, + 0.01271666307002306, + 0.0134016377851367, + 0.014123506844043732, + 0.014334212057292461, + 0.014368176460266113, + 0.014402222819626331, + 0.015140814706683159, + 0.01593579724431038, + 0.016743013635277748, + 0.01745527796447277, + 0.018197841942310333, + 0.019096633419394493, + 0.020256677642464638, + 0.02148718573153019, + 0.022520121186971664, + 0.02337687276303768, + 0.024266216903924942, + 0.02599414996802807, + 0.02819289267063141, + 0.030577614903450012, + 0.03211045265197754, + 0.033546965569257736, + 0.0350477434694767, + 0.03722083568572998, + 0.03953401371836662, + 0.04195498675107956, + 0.04419999197125435, + 0.04656513035297394, + 0.04922123998403549, + 0.0527220144867897, + 0.05647177994251251, + 0.06019167974591255, + 0.06335996091365814, + 0.06669499725103378, + 0.07069884985685349, + 0.07593978196382523, + 0.08156923204660416, + 0.08536817878484726, + 0.085841603577137, + 0.08631765097379684, + 0.08596104383468628, + 0.08449184149503708, + 0.08304774761199951, + 0.0805322527885437, + 0.07675450295209885, + 0.07315396517515182, + 0.06979858875274658, + 0.0666913241147995, + 0.0637223944067955, + 0.06108415126800537, + 0.05882284417748451, + 0.05664524808526039, + 0.05456153303384781, + 0.05257532373070717, + 0.05066142603754997, + 0.048606596887111664, + 0.046220142394304276, + 0.04395085945725441, + 0.04203971475362778, + 0.040909066796302795, + 0.03980882838368416, + 0.03890157490968704, + 0.03882329910993576, + 0.03874518349766731, + 0.03863275796175003, + 0.03799530863761902, + 0.03736836835741997, + 0.036751776933670044, + 0.03493120148777962, + 0.03312555328011513, + 0.0314132459461689, + 0.03071003220975399, + 0.030256353318691254, + 0.02980937622487545, + 0.02947685495018959, + 0.029208635911345482, + 0.028942858800292015, + 0.028349462896585464, + 0.027396466583013535, + 0.026475507766008377, + 0.02572217397391796, + 0.025357045233249664, + 0.024997100234031677, + 0.024633921682834625, + 0.024136371910572052, + 0.02364887297153473, + 0.02317121997475624, + 0.02253100648522377, + 0.02187313511967659, + 0.021234475076198578, + 0.02080301195383072, + 0.020517103374004364, + 0.020235124975442886, + 0.01969147101044655, + 0.018598424270749092, + 0.017566051334142685, + 0.016606301069259644, + 0.016292808577418327, + 0.015985233709216118, + 0.01568346656858921, + 0.015186654403805733, + 0.014630830846726894, + 0.014095351099967957, + 0.013695122674107552, + 0.013478090055286884, + 0.013264496810734272, + 0.009900822304189205, + 0.010430462658405304, + 0.01112256571650505, + 0.011860592290759087, + 0.01231935154646635, + 0.01265016570687294, + 0.012989862821996212, + 0.013517896644771099, + 0.01407630369067192, + 0.014790607616305351, + 0.016122041270136833, + 0.01757332682609558, + 0.018637103959918022, + 0.01904359459877014, + 0.0194589514285326, + 0.019685616716742516, + 0.01980123296380043, + 0.019917530938982964, + 0.020482584834098816, + 0.021158277988433838, + 0.0218642707914114, + 0.023322410881519318, + 0.024877794086933136, + 0.026457104831933975, + 0.027741096913814545, + 0.029087403789162636, + 0.030475523322820663, + 0.03187839314341545, + 0.03334583342075348, + 0.034590937197208405, + 0.035526175051927567, + 0.03648669645190239, + 0.0384771004319191, + 0.041389718651771545, + 0.04452282190322876, + 0.04673578217625618, + 0.04847282916307449, + 0.05027444288134575, + 0.05194346234202385, + 0.053600702434778214, + 0.055310823023319244, + 0.05652259290218353, + 0.057638030499219894, + 0.05877547711133957, + 0.05950508639216423, + 0.06017931550741196, + 0.060861192643642426, + 0.06098855286836624, + 0.061056770384311676, + 0.06112506240606308, + 0.061064332723617554, + 0.060992609709501266, + 0.060920972377061844, + 0.059667181223630905, + 0.058340925723314285, + 0.057044148445129395, + 0.05690236762166023, + 0.056881438940763474, + 0.05686051398515701, + 0.05569085478782654, + 0.05437934026122093, + 0.053098712116479874, + 0.051472604274749756, + 0.04981626570224762, + 0.04821322113275528, + 0.04734537750482559, + 0.04671794921159744, + 0.04609883949160576, + 0.04486287385225296, + 0.04335735738277435, + 0.04190235957503319, + 0.04149313643574715, + 0.041872501373291016, + 0.042255330830812454, + 0.04207763075828552, + 0.04120245948433876, + 0.04034547880291939, + 0.039647672325372696, + 0.03928165137767792, + 0.038919009268283844, + 0.03846399858593941, + 0.037476032972335815, + 0.036513447761535645, + 0.03557558357715607, + 0.03532995656132698, + 0.03510325029492378, + 0.034877996891736984, + 0.03386608883738518, + 0.03267527371644974, + 0.03152632713317871, + 0.03068540245294571, + 0.030061574652791023, + 0.02945042960345745, + 0.02885998971760273, + 0.02829667739570141, + 0.027744362130761147, + 0.027167247608304024, + 0.02629425749182701, + 0.025449318811297417, + 0.02463153377175331, + 0.02394842728972435, + 0.023304827511310577, + 0.022678522393107414, + 0.022096708416938782, + 0.021551474928855896, + 0.021019691601395607, + 0.02043837495148182, + 0.01969524472951889, + 0.018979130312800407, + 0.018289057537913322, + 0.01824278011918068, + 0.018240705132484436, + 0.018238628283143044, + 0.005773135926574469, + 0.00605841726064682, + 0.00641471054404974, + 0.006791956722736359, + 0.0069344500079751015, + 0.0069161891005933285, + 0.0068979766219854355, + 0.007012614980340004, + 0.007150248158723116, + 0.007297019008547068, + 0.007501107174903154, + 0.007710903417319059, + 0.007977011613547802, + 0.008356955833733082, + 0.00875499751418829, + 0.009017253294587135, + 0.009156767278909683, + 0.009298441000282764, + 0.00968995876610279, + 0.010189767926931381, + 0.010715357027947903, + 0.011128142476081848, + 0.011544337496161461, + 0.01198183000087738, + 0.012501091696321964, + 0.013042856007814407, + 0.013585519976913929, + 0.014072899706661701, + 0.014577765017747879, + 0.015144603326916695, + 0.01581384427845478, + 0.016512656584382057, + 0.01728690229356289, + 0.018148524686694145, + 0.01905309036374092, + 0.02010215073823929, + 0.02128620631992817, + 0.022540004923939705, + 0.023518050089478493, + 0.02435234747827053, + 0.025216244161128998, + 0.026057520881295204, + 0.026906095445156097, + 0.02778230421245098, + 0.028730865567922592, + 0.029724949970841408, + 0.030753429979085922, + 0.03170774504542351, + 0.03266490623354912, + 0.0336509644985199, + 0.034842826426029205, + 0.03611578047275543, + 0.03743523731827736, + 0.03831324726343155, + 0.039105724543333054, + 0.039914585649967194, + 0.04067458212375641, + 0.04143304005265236, + 0.04220563545823097, + 0.043280985206365585, + 0.044471338391304016, + 0.04569442942738533, + 0.04699571058154106, + 0.04835183173418045, + 0.049747075885534286, + 0.05073409155011177, + 0.05149807035923004, + 0.052273549139499664, + 0.05331696197390556, + 0.05458265542984009, + 0.05587839335203171, + 0.057126495987176895, + 0.0583094097673893, + 0.05951681360602379, + 0.060695111751556396, + 0.06179041042923927, + 0.06290547549724579, + 0.06376092880964279, + 0.06352517753839493, + 0.06329029053449631, + 0.0631222128868103, + 0.06431788951158524, + 0.06553621590137482, + 0.06677761673927307, + 0.0667286142706871, + 0.06648983806371689, + 0.06625191867351532, + 0.06575087457895279, + 0.06513099372386932, + 0.06451695412397385, + 0.06368962675333023, + 0.06263043731451035, + 0.06158885732293129, + 0.060632526874542236, + 0.059900421649217606, + 0.05917714908719063, + 0.05846261605620384, + 0.0557561032474041, + 0.053167857229709625, + 0.050699763000011444, + 0.04862857609987259, + 0.04674167558550835, + 0.044927991926670074, + 0.04327152296900749, + 0.04177907109260559, + 0.040338095277547836, + 0.03889922425150871, + 0.0372471958398819, + 0.03566532954573631, + 0.03415064513683319, + 0.032510966062545776, + 0.03091251291334629, + 0.029392652213573456, + 0.006563750095665455, + 0.006755799986422062, + 0.007010956294834614, + 0.007282617501914501, + 0.0075387535616755486, + 0.007671377155929804, + 0.007806333247572184, + 0.007937183603644371, + 0.008061239495873451, + 0.00818723440170288, + 0.008747214451432228, + 0.00958992913365364, + 0.010513830929994583, + 0.010603293776512146, + 0.010579683817923069, + 0.010596999898552895, + 0.011013339273631573, + 0.011446035467088223, + 0.011828797869384289, + 0.012054570019245148, + 0.012284652329981327, + 0.012588480487465858, + 0.012982317246496677, + 0.013388474471867085, + 0.014047740958631039, + 0.01489279791712761, + 0.015788687393069267, + 0.01638772152364254, + 0.016902292147278786, + 0.01743302121758461, + 0.01805724948644638, + 0.01871279627084732, + 0.019399136304855347, + 0.020741472020745277, + 0.022176694124937057, + 0.023577051237225533, + 0.023916736245155334, + 0.024261316284537315, + 0.02475104108452797, + 0.025878364220261574, + 0.02705703116953373, + 0.028279809281229973, + 0.029528070241212845, + 0.030831431970000267, + 0.031934693455696106, + 0.032458364963531494, + 0.032990626990795135, + 0.03388574719429016, + 0.03556017950177193, + 0.03731735423207283, + 0.039043452590703964, + 0.04061334580183029, + 0.04224635288119316, + 0.04355553537607193, + 0.04413236305117607, + 0.04471683129668236, + 0.04549640417098999, + 0.046699583530426025, + 0.04793458431959152, + 0.049077197909355164, + 0.04992179945111275, + 0.05078093707561493, + 0.05182560905814171, + 0.05348871648311615, + 0.055205199867486954, + 0.0566423200070858, + 0.05629058927297592, + 0.05594104155898094, + 0.05569905415177345, + 0.0569450743496418, + 0.05821896344423294, + 0.05952135846018791, + 0.059837836772203445, + 0.06011439859867096, + 0.060392238199710846, + 0.060511987656354904, + 0.06060085445642471, + 0.06068985536694527, + 0.060551997274160385, + 0.06031547859311104, + 0.06007988005876541, + 0.05976182222366333, + 0.05937379598617554, + 0.0589882917702198, + 0.058885976672172546, + 0.0592869371175766, + 0.05969063192605972, + 0.059823714196681976, + 0.05858389288187027, + 0.05736975744366646, + 0.056180790066719055, + 0.056194089353084564, + 0.05626807361841202, + 0.05634216219186783, + 0.05420621111989021, + 0.05134914442896843, + 0.048642661422491074, + 0.04652872309088707, + 0.04499426484107971, + 0.04351040720939636, + 0.041999656707048416, + 0.040256842970848083, + 0.038586344569921494, + 0.03698516637086868, + 0.0363217368721962, + 0.03574768081307411, + 0.03518269956111908, + 0.03441964089870453, + 0.03354618698358536, + 0.03269490227103233, + 0.03148180618882179, + 0.02943040244281292, + 0.027512673288583755, + 0.0057568917982280254, + 0.005998661741614342, + 0.0061935256235301495, + 0.006339995190501213, + 0.006489928346127272, + 0.006710770074278116, + 0.006958381738513708, + 0.007217660080641508, + 0.007554357405751944, + 0.007906761020421982, + 0.008219929412007332, + 0.008394699543714523, + 0.008573186583817005, + 0.008831488899886608, + 0.009177600964903831, + 0.009537276811897755, + 0.009871412068605423, + 0.01019996777176857, + 0.010539459064602852, + 0.011001762002706528, + 0.011498309671878815, + 0.012008389458060265, + 0.012414751574397087, + 0.012834864668548107, + 0.01326770894229412, + 0.013709912076592445, + 0.014166852459311485, + 0.014792469330132008, + 0.015723159536719322, + 0.016712404787540436, + 0.01753808744251728, + 0.018166817724704742, + 0.018818089738488197, + 0.01989883743226528, + 0.02132534421980381, + 0.022854115813970566, + 0.02366531267762184, + 0.024147672578692436, + 0.024639863520860672, + 0.02595604956150055, + 0.02759227156639099, + 0.029331635683774948, + 0.031182684004306793, + 0.033150963485240936, + 0.035243481397628784, + 0.036347031593322754, + 0.037335868924856186, + 0.03835160657763481, + 0.03932246193289757, + 0.04031071066856384, + 0.041323792189359665, + 0.04313856363296509, + 0.04510124772787094, + 0.047153227031230927, + 0.048802249133586884, + 0.050462957471609116, + 0.052180174738168716, + 0.05264239013195038, + 0.05295513570308685, + 0.05326974019408226, + 0.05492784455418587, + 0.056875117123126984, + 0.0588914230465889, + 0.05999215319752693, + 0.06086232140660286, + 0.06174510717391968, + 0.062398672103881836, + 0.06296641379594803, + 0.06353932619094849, + 0.06357599794864655, + 0.0633009821176529, + 0.06302716583013535, + 0.06326808035373688, + 0.06398091465234756, + 0.06470178067684174, + 0.06523872166872025, + 0.06548856943845749, + 0.06573937088251114, + 0.06582662463188171, + 0.06543343514204025, + 0.06504259258508682, + 0.06452721357345581, + 0.06279778480529785, + 0.061114706099033356, + 0.05947674438357353, + 0.058266300708055496, + 0.05711628496646881, + 0.055988967418670654, + 0.05435969680547714, + 0.05257728323340416, + 0.05085332319140434, + 0.049452848732471466, + 0.04835137724876404, + 0.04727444052696228, + 0.04612382873892784, + 0.04474073275923729, + 0.043399110436439514, + 0.04208405315876007, + 0.03996582329273224, + 0.03795421123504639, + 0.03604385256767273, + 0.034622468054294586, + 0.03338710218667984, + 0.032195817679166794, + 0.03106764703989029, + 0.03000268153846264, + 0.028974223881959915, + 0.02783411741256714, + 0.025951465591788292, + 0.02419615350663662, + 0.022559568285942078, + 0.021593032404780388, + 0.020784074440598488, + 0.006796956993639469, + 0.007001329679042101, + 0.007222776301205158, + 0.007498509716242552, + 0.0077847689390182495, + 0.008031638339161873, + 0.008225720375776291, + 0.008424491621553898, + 0.008726073428988457, + 0.00908009335398674, + 0.009448477067053318, + 0.009981696493923664, + 0.01055405754595995, + 0.011124147102236748, + 0.01154141966253519, + 0.011974344030022621, + 0.01233546994626522, + 0.012554987333714962, + 0.012778409756720066, + 0.013164559379220009, + 0.013692665845155716, + 0.014241956174373627, + 0.01498433481901884, + 0.015831828117370605, + 0.016727251932024956, + 0.017171671614050865, + 0.017564481124281883, + 0.017981218174099922, + 0.018917564302682877, + 0.0199026670306921, + 0.020845646038651466, + 0.021304288879036903, + 0.021773023530840874, + 0.02242118865251541, + 0.023584818467497826, + 0.024808837100863457, + 0.02639646641910076, + 0.028676001355051994, + 0.03115238808095455, + 0.03323790058493614, + 0.03462695702910423, + 0.036074064671993256, + 0.03726424276828766, + 0.038154974579811096, + 0.039066996425390244, + 0.039882317185401917, + 0.04060870781540871, + 0.04134832322597504, + 0.043220154941082, + 0.046123676002025604, + 0.04922226071357727, + 0.05108419060707092, + 0.05190194770693779, + 0.05273279920220375, + 0.05397569015622139, + 0.05557074770331383, + 0.057212941348552704, + 0.05812566727399826, + 0.05837545916438103, + 0.05862632393836975, + 0.05906563997268677, + 0.05970244109630585, + 0.060346104204654694, + 0.061245910823345184, + 0.062489207834005356, + 0.06375773996114731, + 0.06470324099063873, + 0.06503535062074661, + 0.06536915898323059, + 0.06553336977958679, + 0.06522539258003235, + 0.0649188682436943, + 0.06444954872131348, + 0.06310048699378967, + 0.06177967041730881, + 0.06051187962293625, + 0.06019379943609238, + 0.059877391904592514, + 0.05956264212727547, + 0.058307938277721405, + 0.05695562809705734, + 0.05563467741012573, + 0.05485802888870239, + 0.05429370328783989, + 0.05373518168926239, + 0.052828773856163025, + 0.05163758248090744, + 0.050473250448703766, + 0.04885187745094299, + 0.046370476484298706, + 0.04401510953903198, + 0.041874274611473083, + 0.040517933666706085, + 0.03920552134513855, + 0.03793562203645706, + 0.036894917488098145, + 0.035907190293073654, + 0.034945905208587646, + 0.033347293734550476, + 0.031453754752874374, + 0.029667731374502182, + 0.02830827794969082, + 0.02758069522678852, + 0.026871811598539352, + 0.02612396702170372, + 0.02461872063577175, + 0.023200206458568573, + 0.021863427013158798, + 0.021014487370848656, + 0.020327335223555565, + 0.019662650302052498, + 0.019158124923706055, + 0.018847960978746414, + 0.007510065566748381, + 0.007711573038250208, + 0.00791848637163639, + 0.008256345055997372, + 0.008618793450295925, + 0.008995897136628628, + 0.009384029544889927, + 0.009788907133042812, + 0.010068442672491074, + 0.01017414778470993, + 0.010280963033437729, + 0.010539192706346512, + 0.010878187604248524, + 0.011228084564208984, + 0.011670337989926338, + 0.012139883823692799, + 0.012627030722796917, + 0.013121421448886395, + 0.013635167852044106, + 0.014224639162421227, + 0.014985868707299232, + 0.015787838026881218, + 0.016496116295456886, + 0.017067791894078255, + 0.017659278586506844, + 0.018458036705851555, + 0.019417844712734222, + 0.020427562296390533, + 0.021426431834697723, + 0.022452156990766525, + 0.023526983335614204, + 0.02424629032611847, + 0.024927740916609764, + 0.02562834322452545, + 0.02651304379105568, + 0.027431609109044075, + 0.02844904735684395, + 0.030423400923609734, + 0.03253477066755295, + 0.03467319533228874, + 0.036213453859090805, + 0.037822138518095016, + 0.039387237280607224, + 0.04055071249604225, + 0.04174855723977089, + 0.04321814328432083, + 0.045504894107580185, + 0.04791263863444328, + 0.05061601474881172, + 0.05395883321762085, + 0.057522427290678024, + 0.06007478013634682, + 0.059453267604112625, + 0.05883818492293358, + 0.05873063951730728, + 0.06001929193735123, + 0.0613362081348896, + 0.0626118928194046, + 0.06368885189294815, + 0.06478432565927505, + 0.06598561257123947, + 0.0675705224275589, + 0.06919349730014801, + 0.07070803642272949, + 0.07131373137235641, + 0.0719246119260788, + 0.07245299220085144, + 0.0715971365571022, + 0.07075139880180359, + 0.06991564482450485, + 0.06830613315105438, + 0.06670542806386948, + 0.06514224410057068, + 0.06360434740781784, + 0.062100838869810104, + 0.0606328621506691, + 0.05848109722137451, + 0.056140635162591934, + 0.05389384552836418, + 0.052288200706243515, + 0.051131051033735275, + 0.04999950900673866, + 0.048642609268426895, + 0.04697204381227493, + 0.04535885527729988, + 0.04379935562610626, + 0.04228779301047325, + 0.040828391909599304, + 0.03941022604703903, + 0.037684764713048935, + 0.03603484481573105, + 0.034457165747880936, + 0.03278685733675957, + 0.03116028569638729, + 0.029614409431815147, + 0.02849702723324299, + 0.02768290601670742, + 0.02689204178750515, + 0.02597029320895672, + 0.02475574053823948, + 0.02359798550605774, + 0.02249930426478386, + 0.02157248556613922, + 0.02068384550511837, + 0.019831812009215355, + 0.019115671515464783, + 0.01845875196158886, + 0.017824409529566765, + 0.01717294380068779, + 0.01649652235209942, + 0.015846744179725647, + 0.015246739611029625, + 0.014870806597173214, + 0.0063498192466795444, + 0.006641533225774765, + 0.006946648471057415, + 0.007135495077818632, + 0.007278608623892069, + 0.007424592040479183, + 0.007954991422593594, + 0.008529266342520714, + 0.009013607166707516, + 0.009085571393370628, + 0.009158110246062279, + 0.009313625283539295, + 0.0095682293176651, + 0.009829794056713581, + 0.010179041884839535, + 0.010579346679151058, + 0.010995394550263882, + 0.011573756113648415, + 0.012202410958707333, + 0.012867112644016743, + 0.013593864627182484, + 0.014361662790179253, + 0.015034489333629608, + 0.015293745324015617, + 0.015557469800114632, + 0.01613716594874859, + 0.017243392765522003, + 0.018425453454256058, + 0.01945628970861435, + 0.02033316157758236, + 0.021249551326036453, + 0.022449225187301636, + 0.02385186031460762, + 0.02534213475883007, + 0.026272423565387726, + 0.027028175070881844, + 0.027805661782622337, + 0.030202548950910568, + 0.03312017396092415, + 0.03631964325904846, + 0.03783624246716499, + 0.03924935683608055, + 0.04071525111794472, + 0.04216168075799942, + 0.04365793615579605, + 0.04519491270184517, + 0.0461590513586998, + 0.04714375361800194, + 0.04819641634821892, + 0.05035464093089104, + 0.052609510719776154, + 0.05501984432339668, + 0.05865118280053139, + 0.06252219527959824, + 0.06654069572687149, + 0.06802304089069366, + 0.0695384070277214, + 0.07110880315303802, + 0.07466042786836624, + 0.07838945090770721, + 0.08230471611022949, + 0.08380148559808731, + 0.08523496985435486, + 0.08669298887252808, + 0.08609960228204727, + 0.08529634028673172, + 0.08450056612491608, + 0.08258981257677078, + 0.08049285411834717, + 0.07844913750886917, + 0.07701539248228073, + 0.07581204175949097, + 0.07462748140096664, + 0.07248920202255249, + 0.06982897967100143, + 0.06726638227701187, + 0.06450542062520981, + 0.061560533940792084, + 0.05875010043382645, + 0.05530440807342529, + 0.050664324313402176, + 0.046413540840148926, + 0.04292549192905426, + 0.041606638580560684, + 0.04032830521464348, + 0.03908924758434296, + 0.035671234130859375, + 0.03251981735229492, + 0.029646819457411766, + 0.027755146846175194, + 0.026178164407610893, + 0.0246907826513052, + 0.02353447675704956, + 0.022618316113948822, + 0.021737821400165558, + 0.020909620448946953, + 0.020149560645222664, + 0.019417131319642067, + 0.018702447414398193, + 0.01789083518087864, + 0.017114445567131042, + 0.016371745616197586, + 0.01582409255206585, + 0.015337052755057812, + 0.014865003526210785, + 0.014160366728901863, + 0.013253467157483101, + 0.012404651381075382, + 0.011667268350720406, + 0.011216734535992146, + 0.010783598758280277, + 0.010367187671363354, + 0.010598627850413322, + 0.0044420515187084675, + 0.004690231755375862, + 0.004952278453856707, + 0.005170723423361778, + 0.005354217253625393, + 0.005544222891330719, + 0.0057046604342758656, + 0.005862523801624775, + 0.006030016578733921, + 0.006260695867240429, + 0.006500199902802706, + 0.006797961890697479, + 0.007221120409667492, + 0.0076706199906766415, + 0.007913634181022644, + 0.007958726026117802, + 0.008004074916243553, + 0.008351892232894897, + 0.008831704966723919, + 0.00933908112347126, + 0.00970356073230505, + 0.010066762566566467, + 0.010458001866936684, + 0.011020001955330372, + 0.011612202040851116, + 0.012185591273009777, + 0.012622053734958172, + 0.013074149377644062, + 0.01371163409203291, + 0.014675907790660858, + 0.015707995742559433, + 0.016846172511577606, + 0.018102848902344704, + 0.019453272223472595, + 0.020508015528321266, + 0.021350905299186707, + 0.022228440269827843, + 0.023225247859954834, + 0.024305375292897224, + 0.025435732677578926, + 0.026974672451615334, + 0.02872372418642044, + 0.030586186796426773, + 0.03202633932232857, + 0.0334111750125885, + 0.03485588729381561, + 0.03690112382173538, + 0.039160341024398804, + 0.04155787453055382, + 0.04485713317990303, + 0.048528846353292465, + 0.052501097321510315, + 0.05637093260884285, + 0.06046777963638306, + 0.06486236304044724, + 0.07032503187656403, + 0.07636387646198273, + 0.08292128145694733, + 0.088191919028759, + 0.093446746468544, + 0.09901466220617294, + 0.10325504839420319, + 0.10725291073322296, + 0.11140555888414383, + 0.11514103412628174, + 0.11879140138626099, + 0.12255749106407166, + 0.1197492852807045, + 0.11375771462917328, + 0.10806592553853989, + 0.10240859538316727, + 0.09686269611120224, + 0.09161712229251862, + 0.08660105615854263, + 0.08179579675197601, + 0.07725716382265091, + 0.0722876638174057, + 0.06626621633768082, + 0.060746341943740845, + 0.05546257272362709, + 0.049613893032073975, + 0.04438197612762451, + 0.03970177844166756, + 0.036649253219366074, + 0.033834848552942276, + 0.031236570328474045, + 0.028137030079960823, + 0.02520032972097397, + 0.022570133209228516, + 0.020649677142500877, + 0.019154300913214684, + 0.01776721514761448, + 0.016661401838064194, + 0.015898047015070915, + 0.015169667080044746, + 0.014487785287201405, + 0.013910037465393543, + 0.01335532870143652, + 0.012822741642594337, + 0.011996601708233356, + 0.011187119409441948, + 0.010432259179651737, + 0.009901273995637894, + 0.009503019973635674, + 0.00912078469991684, + 0.008728798478841782, + 0.008302041329443455, + 0.007896148599684238, + 0.007510454393923283, + 0.007244698237627745, + 0.006988345179706812, + 0.006741063669323921, + 0.006482610013335943, + 0.0029567733872681856, + 0.003012255532667041, + 0.0030687786638736725, + 0.003161806147545576, + 0.0032967212609946728, + 0.0034373935777693987, + 0.003564854385331273, + 0.0036903719883412123, + 0.003820308716967702, + 0.003985745832324028, + 0.004158488940447569, + 0.004342551808804274, + 0.0045484029687941074, + 0.004764012061059475, + 0.004928273148834705, + 0.005019278731197119, + 0.005111964885145426, + 0.005309063009917736, + 0.005573776550590992, + 0.005851689260452986, + 0.006150216329842806, + 0.006465449929237366, + 0.0067968410439789295, + 0.007170610595494509, + 0.007565029431134462, + 0.007969425059854984, + 0.008325344882905483, + 0.00869716051965952, + 0.009141621179878712, + 0.00975764263421297, + 0.01041517686098814, + 0.010973636992275715, + 0.01134469360113144, + 0.011728296987712383, + 0.012282395735383034, + 0.013022956438362598, + 0.013808166608214378, + 0.01453736424446106, + 0.015232427977025509, + 0.015960723161697388, + 0.017052384093403816, + 0.018394360318779945, + 0.01984194479882717, + 0.02110501378774643, + 0.02232905477285385, + 0.023624088615179062, + 0.025568049401044846, + 0.02786768600344658, + 0.030374154448509216, + 0.03214481100440025, + 0.03374473750591278, + 0.03542429953813553, + 0.04020925611257553, + 0.04660087451338768, + 0.054008495062589645, + 0.06371238827705383, + 0.07554173469543457, + 0.0895674079656601, + 0.10215770453214645, + 0.11500973999500275, + 0.12947863340377808, + 0.1441470831632614, + 0.15971913933753967, + 0.17697341740131378, + 0.18137969076633453, + 0.17789119482040405, + 0.17446981370449066, + 0.163608580827713, + 0.14808399975299835, + 0.13403251767158508, + 0.12192597985267639, + 0.111567422747612, + 0.10208889842033386, + 0.09365937113761902, + 0.08635102957487106, + 0.07961296290159225, + 0.07231982052326202, + 0.062182504683732986, + 0.05346617475152016, + 0.04595569148659706, + 0.0392935648560524, + 0.03359724208712578, + 0.028726700693368912, + 0.025598090142011642, + 0.022922541946172714, + 0.020526645705103874, + 0.01864318922162056, + 0.017031915485858917, + 0.015559898689389229, + 0.01419723592698574, + 0.012937843799591064, + 0.011790168471634388, + 0.010840063914656639, + 0.010195259004831314, + 0.009588811546564102, + 0.009022781625390053, + 0.008587037213146687, + 0.008172336034476757, + 0.007777662947773933, + 0.007257991004735231, + 0.0067360540851950645, + 0.006251650396734476, + 0.005914713721722364, + 0.005702356807887554, + 0.005497624631971121, + 0.005296043120324612, + 0.005086623132228851, + 0.004885483533143997, + 0.004692298360168934, + 0.004510755650699139, + 0.004336686339229345, + 0.004169334191828966, + 0.003983937669545412, + 0.0031745147425681353, + 0.003223010338842869, + 0.0032722465693950653, + 0.003350280923768878, + 0.0034646796993911266, + 0.0035829846747219563, + 0.0037702491972595453, + 0.003994344733655453, + 0.004231759812682867, + 0.004272110760211945, + 0.004305477719753981, + 0.004372033756226301, + 0.00457840645685792, + 0.004794520325958729, + 0.0049990261904895306, + 0.005180098116397858, + 0.005367728415876627, + 0.005560499150305986, + 0.005759111139923334, + 0.005964816082268953, + 0.00633146520704031, + 0.006762729026377201, + 0.007223369088023901, + 0.007566829677671194, + 0.007921161130070686, + 0.008279558271169662, + 0.008557142689824104, + 0.008844033814966679, + 0.009147722274065018, + 0.009483602829277515, + 0.009831816889345646, + 0.010271391831338406, + 0.010868867859244347, + 0.011501098982989788, + 0.012157161720097065, + 0.01283577922731638, + 0.01355227641761303, + 0.014062289148569107, + 0.014398882165551186, + 0.014743532985448837, + 0.015305510722100735, + 0.016013428568840027, + 0.016754088923335075, + 0.017768241465091705, + 0.01895741932094097, + 0.020226184278726578, + 0.021213628351688385, + 0.022109538316726685, + 0.023043284192681313, + 0.024494046345353127, + 0.026205431669950485, + 0.028036391362547874, + 0.03117009438574314, + 0.03508392348885536, + 0.03948918730020523, + 0.04593486711382866, + 0.054038457572460175, + 0.06357164680957794, + 0.07249756902456284, + 0.08166204392910004, + 0.09198500961065292, + 0.10413013398647308, + 0.11816904693841934, + 0.13410069048404694, + 0.1483534723520279, + 0.16142603754997253, + 0.17565053701400757, + 0.188249871134758, + 0.1990053504705429, + 0.2103753238916397, + 0.20933501422405243, + 0.19206804037094116, + 0.17622533440589905, + 0.15257592499256134, + 0.11621728539466858, + 0.08852285891771317, + 0.06869090348482132, + 0.0580504909157753, + 0.04905831441283226, + 0.0414518341422081, + 0.03481268510222435, + 0.02923690155148506, + 0.024554163217544556, + 0.021714752539992332, + 0.019366750493645668, + 0.01727263629436493, + 0.015616266056895256, + 0.014212522655725479, + 0.01293496135622263, + 0.01193252019584179, + 0.01117786020040512, + 0.010470928624272346, + 0.009799777530133724, + 0.009146101772785187, + 0.008536027744412422, + 0.007967590354382992, + 0.007595483213663101, + 0.007240754086524248, + 0.0069025917910039425, + 0.006538694724440575, + 0.0061806971207261086, + 0.0058422996662557125, + 0.005621881224215031, + 0.005519969388842583, + 0.005419905297458172, + 0.005339637864381075, + 0.005345577839761972, + 0.005351524334400892, + 0.005357477813959122, + 0.00498760724440217, + 0.004588495474308729, + 0.004221320617944002, + 0.004011738114058971, + 0.009300243109464645, + 0.00977080874145031, + 0.010265183635056019, + 0.010855565778911114, + 0.01155983004719019, + 0.0123097850009799, + 0.012716793455183506, + 0.01300408411771059, + 0.013297866098582745, + 0.01382383517920971, + 0.014371643774211407, + 0.014908745884895325, + 0.015352092683315277, + 0.015808623284101486, + 0.016320377588272095, + 0.016902882605791092, + 0.017506176605820656, + 0.018020881339907646, + 0.018488189205527306, + 0.01896761544048786, + 0.0204016026109457, + 0.022160740569233894, + 0.02407156117260456, + 0.023927444592118263, + 0.02377675287425518, + 0.023845821619033813, + 0.025206778198480606, + 0.026645410805940628, + 0.02788645215332508, + 0.028466172516345978, + 0.02905794233083725, + 0.029802532866597176, + 0.030778110027313232, + 0.03178562596440315, + 0.03268241509795189, + 0.03346335515379906, + 0.03426295518875122, + 0.03544354811310768, + 0.03691839054226875, + 0.038454607129096985, + 0.039350658655166626, + 0.03991692140698433, + 0.040491342544555664, + 0.041944097727537155, + 0.043796356767416, + 0.04573041573166847, + 0.04671189934015274, + 0.04738997295498848, + 0.048077888786792755, + 0.04959467053413391, + 0.05139356851577759, + 0.053257718682289124, + 0.05517793074250221, + 0.05716418847441673, + 0.059221941977739334, + 0.060713138431310654, + 0.06205524504184723, + 0.06342702358961105, + 0.06525873392820358, + 0.06729249656200409, + 0.06938964128494263, + 0.07070644199848175, + 0.07168630510568619, + 0.07267975062131882, + 0.07371532917022705, + 0.0747818872332573, + 0.07586389034986496, + 0.07640525698661804, + 0.07651090621948242, + 0.07661671191453934, + 0.07630050182342529, + 0.07549670338630676, + 0.07470137625932693, + 0.07272045314311981, + 0.06864158064126968, + 0.0647914856672287, + 0.06094968318939209, + 0.05661788955330849, + 0.05259396508336067, + 0.048854343593120575, + 0.04535694047808647, + 0.04210991412401199, + 0.03909533843398094, + 0.03658990561962128, + 0.03427782654762268, + 0.032111845910549164, + 0.03026522696018219, + 0.02859620563685894, + 0.02701922506093979, + 0.025601893663406372, + 0.024327052757143974, + 0.02311568893492222, + 0.022095881402492523, + 0.021445272490382195, + 0.020813820883631706, + 0.020183492451906204, + 0.019177457317709923, + 0.018221566453576088, + 0.017313320189714432, + 0.016537079587578773, + 0.015818800777196884, + 0.015131719410419464, + 0.014690611511468887, + 0.014471003785729408, + 0.014254678972065449, + 0.013971040025353432, + 0.01343539822846651, + 0.01292029395699501, + 0.012424937449395657, + 0.01230468787252903, + 0.012227416969835758, + 0.012150632217526436, + 0.01202835701406002, + 0.011639771051704884, + 0.012305740267038345, + 0.013009810820221901, + 0.013488872908055782, + 0.013785346411168575, + 0.014088336378335953, + 0.014464978128671646, + 0.014865062199532986, + 0.015326278284192085, + 0.01636682078242302, + 0.017478009685873985, + 0.018565159291028976, + 0.019494445994496346, + 0.02047024667263031, + 0.021638648584485054, + 0.023007329553365707, + 0.024462580680847168, + 0.025194207206368446, + 0.025650573894381523, + 0.026115208864212036, + 0.026757126674056053, + 0.02743002213537693, + 0.02814384363591671, + 0.029130809009075165, + 0.03015238791704178, + 0.03135637938976288, + 0.033091261982917786, + 0.03492213040590286, + 0.03703678026795387, + 0.039598818868398666, + 0.04233808070421219, + 0.04417891427874565, + 0.044991277158260345, + 0.045818571001291275, + 0.047806885093450546, + 0.05067926272749901, + 0.05372421443462372, + 0.05436041206121445, + 0.05388079211115837, + 0.05340540409088135, + 0.0550653375685215, + 0.057469550520181656, + 0.05997873470187187, + 0.059905946254730225, + 0.05926072224974632, + 0.05862245336174965, + 0.05957452580332756, + 0.0608094222843647, + 0.06206992268562317, + 0.0622040219604969, + 0.06218486279249191, + 0.06216571107506752, + 0.061702508479356766, + 0.06118683144450188, + 0.060675472021102905, + 0.05960896238684654, + 0.05848348140716553, + 0.05737925320863724, + 0.05733700469136238, + 0.05748462304472923, + 0.057632625102996826, + 0.056186094880104065, + 0.05439762398600578, + 0.0526660792529583, + 0.05269072949886322, + 0.053330257534980774, + 0.05397754907608032, + 0.05360914021730423, + 0.05272464454174042, + 0.05185473710298538, + 0.05017852038145065, + 0.04794555529952049, + 0.045811958611011505, + 0.044106531888246536, + 0.0428650826215744, + 0.04165858402848244, + 0.04037280008196831, + 0.038888588547706604, + 0.037458937615156174, + 0.036023326218128204, + 0.03435835987329483, + 0.03277035057544708, + 0.03125573694705963, + 0.03008189983665943, + 0.02895299158990383, + 0.02786644734442234, + 0.02679525502026081, + 0.02575955167412758, + 0.024763882160186768, + 0.02397860400378704, + 0.02332635596394539, + 0.022691849619150162, + 0.022068481892347336, + 0.021452771499753, + 0.02085423655807972, + 0.020224396139383316, + 0.019343756139278412, + 0.018501462414860725, + 0.017695846036076546, + 0.01747758314013481, + 0.017331989482045174, + 0.017187606543302536, + 0.01674662157893181, + 0.01613539457321167, + 0.015546474605798721, + 0.015044542960822582, + 0.014696439728140831, + 0.014356390573084354, + 0.014024326577782631, + 0.013733861036598682, + 0.01344941183924675, + 0.01317085325717926, + 0.012813296169042587, + 0.010704891756176949, + 0.011039629578590393, + 0.011384834535419941, + 0.012154823169112206, + 0.013151128776371479, + 0.014229100197553635, + 0.014591860584914684, + 0.014952416531741619, + 0.015438839793205261, + 0.016342081129550934, + 0.017298167571425438, + 0.01810966059565544, + 0.01872267574071884, + 0.019356444478034973, + 0.020285597071051598, + 0.021392948925495148, + 0.02256074920296669, + 0.023964978754520416, + 0.02548026293516159, + 0.02704027108848095, + 0.02800658531486988, + 0.029007436707615852, + 0.030285948887467384, + 0.032425083220005035, + 0.03471530228853226, + 0.03657229244709015, + 0.03759190812706947, + 0.03863995149731636, + 0.04028485715389252, + 0.0425230972468853, + 0.04488569125533104, + 0.04734419286251068, + 0.0499177910387516, + 0.05263129249215126, + 0.05499103292822838, + 0.057293493300676346, + 0.05969236046075821, + 0.06204358860850334, + 0.06446047872304916, + 0.06697151064872742, + 0.06901884824037552, + 0.07108114659786224, + 0.07320506870746613, + 0.07199599593877792, + 0.07074055075645447, + 0.06951455771923065, + 0.06867721676826477, + 0.06784995645284653, + 0.06705443561077118, + 0.0667494535446167, + 0.06644585728645325, + 0.06607242673635483, + 0.06434967368841171, + 0.06267184019088745, + 0.06102549284696579, + 0.059126634150743484, + 0.057286862283945084, + 0.05550297722220421, + 0.05365888401865959, + 0.05187605321407318, + 0.05015246197581291, + 0.04961489140987396, + 0.049122121185064316, + 0.04863424599170685, + 0.04764851555228233, + 0.046631284058094025, + 0.04563577473163605, + 0.04372114688158035, + 0.041699331253767014, + 0.03977101296186447, + 0.03883448988199234, + 0.03825215622782707, + 0.0376785583794117, + 0.03711218014359474, + 0.03655346855521202, + 0.03600316494703293, + 0.03488927334547043, + 0.033229462802410126, + 0.03164862096309662, + 0.030353417620062828, + 0.02951560541987419, + 0.028700917959213257, + 0.027933374047279358, + 0.027305100113153458, + 0.026690959930419922, + 0.026090633124113083, + 0.02480597048997879, + 0.023573800921440125, + 0.02240283600986004, + 0.021717999130487442, + 0.02117176353931427, + 0.020639266818761826, + 0.02036462165415287, + 0.020284784957766533, + 0.020205261185765266, + 0.019845401868224144, + 0.018923334777355194, + 0.018044106662273407, + 0.017244167625904083, + 0.017020264640450478, + 0.01679926924407482, + 0.01658114232122898, + 0.016114765778183937, + 0.015596981160342693, + 0.015095834620296955, + 0.014716172590851784, + 0.014451476745307446, + 0.01419154368340969, + 0.013913100585341454, + 0.01353905163705349, + 0.013175059109926224, + 0.012820852920413017, + 0.012604501098394394, + 0.010356491431593895, + 0.010747128166258335, + 0.011152499355375767, + 0.0117157232016325, + 0.012319029308855534, + 0.013028888031840324, + 0.014117795042693615, + 0.01529770903289318, + 0.016298484057188034, + 0.016999606043100357, + 0.017730889841914177, + 0.018416941165924072, + 0.0190916545689106, + 0.01979108713567257, + 0.020702943205833435, + 0.021679727360606194, + 0.022708162665367126, + 0.023838916793465614, + 0.025025976821780205, + 0.026225050911307335, + 0.02735837735235691, + 0.028540676459670067, + 0.02968698740005493, + 0.030771857127547264, + 0.03189637511968613, + 0.03354739397764206, + 0.03561173751950264, + 0.03780310973525047, + 0.04055168479681015, + 0.04365137219429016, + 0.04698799550533295, + 0.04817714914679527, + 0.049051303416490555, + 0.04994131997227669, + 0.05300668254494667, + 0.056305788457393646, + 0.05964506044983864, + 0.06095103546977043, + 0.062285613268613815, + 0.06398411840200424, + 0.06778424233198166, + 0.0718100517988205, + 0.07468689233064651, + 0.07226823270320892, + 0.06992790848016739, + 0.0680445060133934, + 0.06737236678600311, + 0.06670687347650528, + 0.06610168516635895, + 0.0656471848487854, + 0.06519581377506256, + 0.06457693129777908, + 0.06352327018976212, + 0.06248680502176285, + 0.06111500784754753, + 0.058837421238422394, + 0.05664471164345741, + 0.05448416247963905, + 0.05225594714283943, + 0.050118859857320786, + 0.04822864010930061, + 0.047038838267326355, + 0.045878391712903976, + 0.04472934082150459, + 0.04350334778428078, + 0.042310960590839386, + 0.0411381870508194, + 0.03979688882827759, + 0.038499318063259125, + 0.03724405914545059, + 0.03731675446033478, + 0.037438325583934784, + 0.03756029158830643, + 0.03673418238759041, + 0.035767149180173874, + 0.03482557088136673, + 0.03350139036774635, + 0.03207765519618988, + 0.030714428052306175, + 0.02986832521855831, + 0.029381489381194115, + 0.02890259027481079, + 0.02820499613881111, + 0.027207348495721817, + 0.026244986802339554, + 0.025446094572544098, + 0.025108080357313156, + 0.02477455697953701, + 0.024440689012408257, + 0.023920560255646706, + 0.023411501199007034, + 0.02291327528655529, + 0.023112110793590546, + 0.02348390780389309, + 0.023861683905124664, + 0.02351771667599678, + 0.022645974531769753, + 0.021806543692946434, + 0.021109089255332947, + 0.020673055201768875, + 0.020246030762791634, + 0.019826920703053474, + 0.019393840804696083, + 0.018970219418406487, + 0.01855585165321827, + 0.018218154087662697, + 0.017909375950694084, + 0.01760583184659481, + 0.01721578650176525, + 0.01671823486685753, + 0.016235066577792168, + 0.01575515791773796, + 0.015200513415038586, + 0.009605414234101772, + 0.010279802605509758, + 0.01097593642771244, + 0.011605704203248024, + 0.012271606363356113, + 0.012930924072861671, + 0.013570384122431278, + 0.014241466298699379, + 0.014591231942176819, + 0.014804253354668617, + 0.015020383521914482, + 0.01540080364793539, + 0.01580027863383293, + 0.0163202416151762, + 0.017439117655158043, + 0.018634701147675514, + 0.019719768315553665, + 0.020526714622974396, + 0.02136668562889099, + 0.022770876064896584, + 0.024721791967749596, + 0.026839852333068848, + 0.028571071103215218, + 0.030195409432053566, + 0.031912095844745636, + 0.032892800867557526, + 0.03379761055111885, + 0.03475514426827431, + 0.036693114787340164, + 0.038739144802093506, + 0.04081965610384941, + 0.04255468025803566, + 0.04436345398426056, + 0.04667365923523903, + 0.050380539149045944, + 0.05438182130455971, + 0.05855284258723259, + 0.0627548098564148, + 0.0672583356499672, + 0.06955327838659286, + 0.06860293447971344, + 0.06766558438539505, + 0.06831955164670944, + 0.07068073004484177, + 0.0731235072016716, + 0.07367869466543198, + 0.07253576815128326, + 0.07141056656837463, + 0.07052785903215408, + 0.06983236223459244, + 0.06914373487234116, + 0.06771513819694519, + 0.06576427072286606, + 0.06386961042881012, + 0.061082541942596436, + 0.057715073227882385, + 0.054533250629901886, + 0.052262406796216965, + 0.05070605129003525, + 0.049196042120456696, + 0.04751104861497879, + 0.04566697031259537, + 0.04389446601271629, + 0.04237286001443863, + 0.04113348573446274, + 0.03993036225438118, + 0.03897335007786751, + 0.03840971365571022, + 0.037854231894016266, + 0.037603773176670074, + 0.03818311542272568, + 0.038771383464336395, + 0.0388750359416008, + 0.03638315945863724, + 0.034051015973091125, + 0.03191782534122467, + 0.03167854994535446, + 0.03144106641411781, + 0.031205367296934128, + 0.0309735257178545, + 0.030743688344955444, + 0.030515555292367935, + 0.029721148312091827, + 0.02873167209327221, + 0.02777513861656189, + 0.027295835316181183, + 0.027210837230086327, + 0.02712610363960266, + 0.026848750188946724, + 0.026200469583272934, + 0.02556784264743328, + 0.025075390934944153, + 0.025526368990540504, + 0.025985458865761757, + 0.0264528039842844, + 0.025864215567708015, + 0.02515326254069805, + 0.02446185238659382, + 0.02381868101656437, + 0.023209260776638985, + 0.022615432739257812, + 0.022097520530223846, + 0.021699057891964912, + 0.021307779476046562, + 0.020918987691402435, + 0.0204735416918993, + 0.020037580281496048, + 0.019610904157161713, + 0.019226964563131332, + 0.018861182034015656, + 0.018502358347177505, + 0.01800946332514286, + 0.017348434776067734, + 0.010549060069024563, + 0.01128408033400774, + 0.011893263086676598, + 0.012362932786345482, + 0.012851149775087833, + 0.013334439136087894, + 0.01382901519536972, + 0.014352907426655293, + 0.015192265622317791, + 0.016080709174275398, + 0.016956759616732597, + 0.017702795565128326, + 0.018481651321053505, + 0.018943270668387413, + 0.019058123230934143, + 0.019173676148056984, + 0.02000659890472889, + 0.02119998075067997, + 0.02246454730629921, + 0.023010095581412315, + 0.023473650217056274, + 0.024019083008170128, + 0.025617195293307304, + 0.02732164040207863, + 0.029022708535194397, + 0.030410226434469223, + 0.03186408057808876, + 0.03337230533361435, + 0.03492487967014313, + 0.036549683660268784, + 0.03796688839793205, + 0.03914230689406395, + 0.04035411402583122, + 0.04229525104165077, + 0.04480712115764618, + 0.0474681630730629, + 0.049693454056978226, + 0.051759302616119385, + 0.05391103774309158, + 0.055936675518751144, + 0.057974763214588165, + 0.060087114572525024, + 0.061023928225040436, + 0.061734601855278015, + 0.06245354935526848, + 0.06323345005512238, + 0.06403008848428726, + 0.0648367628455162, + 0.064702607691288, + 0.06447768211364746, + 0.06425353139638901, + 0.061684589833021164, + 0.05903441086411476, + 0.05649809539318085, + 0.05521741136908531, + 0.05406779795885086, + 0.05294211208820343, + 0.05144292488694191, + 0.04994107410311699, + 0.04848306253552437, + 0.04684218019247055, + 0.04522007331252098, + 0.04365413635969162, + 0.04242131859064102, + 0.0412919782102108, + 0.040192704647779465, + 0.040037091821432114, + 0.04023391753435135, + 0.04043170437216759, + 0.03999284282326698, + 0.03919798508286476, + 0.03841892629861832, + 0.037449516355991364, + 0.03632361441850662, + 0.0352315716445446, + 0.03440316021442413, + 0.03393769636750221, + 0.03347852826118469, + 0.03317907080054283, + 0.033332329243421555, + 0.033486295491456985, + 0.03361447900533676, + 0.03348414599895477, + 0.033354319632053375, + 0.03322499245405197, + 0.032610222697257996, + 0.03196192532777786, + 0.031326521188020706, + 0.031513847410678864, + 0.03203149512410164, + 0.0325576476752758, + 0.03258681297302246, + 0.032118745148181915, + 0.03165740147233009, + 0.03134075179696083, + 0.03140554577112198, + 0.03147047385573387, + 0.03151848167181015, + 0.030487552285194397, + 0.029490342363715172, + 0.02852574922144413, + 0.028076324611902237, + 0.027798589318990707, + 0.027523601427674294, + 0.027096273377537727, + 0.026495156809687614, + 0.025907374918460846, + 0.02531057596206665, + 0.02460552379488945, + 0.023920107632875443, + 0.0232537891715765, + 0.022557003423571587, + 0.02187095768749714, + 0.011405032128095627, + 0.011699999682605267, + 0.01222930010408163, + 0.012809987179934978, + 0.013450097292661667, + 0.014289415441453457, + 0.015181109309196472, + 0.01573774218559265, + 0.015777526423335075, + 0.015817413106560707, + 0.016502736136317253, + 0.01757144369184971, + 0.01870935969054699, + 0.019186856225132942, + 0.019582081586122513, + 0.019999342039227486, + 0.02056148089468479, + 0.021139418706297874, + 0.02189774066209793, + 0.023110274225473404, + 0.024389946833252907, + 0.02539309859275818, + 0.026026250794529915, + 0.026675192639231682, + 0.027479048818349838, + 0.02839316427707672, + 0.0293376874178648, + 0.03040294721722603, + 0.03153456747531891, + 0.032708313316106796, + 0.03380703926086426, + 0.03492891043424606, + 0.03609282523393631, + 0.037723980844020844, + 0.03942885249853134, + 0.041133057326078415, + 0.04224630072712898, + 0.04338966682553291, + 0.04468214884400368, + 0.046542949974536896, + 0.04848124459385872, + 0.05028396099805832, + 0.05149137228727341, + 0.05272777006030083, + 0.05366772040724754, + 0.053851787000894547, + 0.05403648316860199, + 0.0540490448474884, + 0.05371030047535896, + 0.053373679518699646, + 0.05285514518618584, + 0.05199316889047623, + 0.05114525184035301, + 0.050416555255651474, + 0.04990147426724434, + 0.04939165711402893, + 0.04888055473566055, + 0.048361022025346756, + 0.04784701392054558, + 0.04716532677412033, + 0.04606064409017563, + 0.04498184099793434, + 0.04404793679714203, + 0.04353423789143562, + 0.04302653670310974, + 0.042502839118242264, + 0.041868340224027634, + 0.04124331474304199, + 0.040700513869524, + 0.04118349775671959, + 0.04167221859097481, + 0.04216673970222473, + 0.041330646723508835, + 0.04045815020799637, + 0.039604078978300095, + 0.04018087685108185, + 0.04105190560221672, + 0.0419418103992939, + 0.041362132877111435, + 0.04016316682100296, + 0.03899895027279854, + 0.03857586905360222, + 0.038773201406002045, + 0.038971539586782455, + 0.039047036319971085, + 0.038902297616004944, + 0.03875809907913208, + 0.03859657421708107, + 0.038345467299222946, + 0.038095999509096146, + 0.037848152220249176, + 0.03720460087060928, + 0.036552201956510544, + 0.03591123968362808, + 0.03596915304660797, + 0.036297887563705444, + 0.036629628390073776, + 0.03641616553068161, + 0.03560233116149902, + 0.03480668365955353, + 0.03404483571648598, + 0.03336091339588165, + 0.03269072622060776, + 0.0320340059697628, + 0.031215883791446686, + 0.030403494834899902, + 0.02961225062608719, + 0.028821660205721855, + 0.02803995832800865, + 0.027279460802674294, + 0.026680467650294304, + 0.02643430605530739, + 0.026190416887402534, + 0.009209223091602325, + 0.009631701745092869, + 0.009750546887516975, + 0.009870858862996101, + 0.010315969586372375, + 0.011004223488271236, + 0.011738396249711514, + 0.012208247557282448, + 0.012647293508052826, + 0.013119323179125786, + 0.013756714761257172, + 0.014425075612962246, + 0.014998107217252254, + 0.015333259478211403, + 0.015675902366638184, + 0.016282813623547554, + 0.017138324677944183, + 0.018038783222436905, + 0.01844569854438305, + 0.018672198057174683, + 0.018901478499174118, + 0.020213192328810692, + 0.021718867123126984, + 0.023220332339406013, + 0.023505542427301407, + 0.023794258013367653, + 0.024443909525871277, + 0.026370778679847717, + 0.028449540957808495, + 0.03018007054924965, + 0.031083490699529648, + 0.03201395273208618, + 0.03324141353368759, + 0.03482375666499138, + 0.03648142144083977, + 0.038404110819101334, + 0.0405723974108696, + 0.04286310821771622, + 0.04413067176938057, + 0.04483514279127121, + 0.04555085673928261, + 0.04599550738930702, + 0.04633717238903046, + 0.046681374311447144, + 0.0471804141998291, + 0.047729454934597015, + 0.04828488454222679, + 0.049494124948978424, + 0.05089222267270088, + 0.05232981592416763, + 0.05196904391050339, + 0.05123060569167137, + 0.05050266161561012, + 0.05040073022246361, + 0.05043111369013786, + 0.05046151578426361, + 0.05000201612710953, + 0.04943104460835457, + 0.048866596072912216, + 0.04844214767217636, + 0.04806050658226013, + 0.04768187180161476, + 0.0473983995616436, + 0.04715217649936676, + 0.04690723493695259, + 0.04676642641425133, + 0.04668090492486954, + 0.046595532447099686, + 0.046223677694797516, + 0.04563775286078453, + 0.04505924880504608, + 0.04498233646154404, + 0.04548632353544235, + 0.04599595069885254, + 0.046417947858572006, + 0.04666255787014961, + 0.04690845310688019, + 0.0470442958176136, + 0.04674399644136429, + 0.046445611864328384, + 0.04614024981856346, + 0.04565630480647087, + 0.04517744109034538, + 0.044703591614961624, + 0.04478929936885834, + 0.04495697841048241, + 0.04512528330087662, + 0.04449569061398506, + 0.043510034680366516, + 0.042546216398477554, + 0.041254922747612, + 0.0396256223320961, + 0.038060665130615234, + 0.03699631616473198, + 0.037327446043491364, + 0.037661537528038025, + 0.03799861669540405, + 0.0369398258626461, + 0.03590552136301994, + 0.03490018472075462, + 0.034044086933135986, + 0.033252403140068054, + 0.03247912600636482, + 0.03170891851186752, + 0.030939100310206413, + 0.03018796816468239, + 0.029568571597337723, + 0.029613522812724113, + 0.029658541083335876, + 0.02970362827181816, + 0.027758480980992317, + 0.025568369776010513, + 0.023551058024168015, + 0.005917656235396862, + 0.006083048414438963, + 0.006310051307082176, + 0.006545525509864092, + 0.006811642553657293, + 0.007105147000402212, + 0.0074112978763878345, + 0.007615969516336918, + 0.007803490851074457, + 0.00799524411559105, + 0.00818707887083292, + 0.00838351622223854, + 0.00861834455281496, + 0.008939157240092754, + 0.009271912276744843, + 0.009648608975112438, + 0.01007154118269682, + 0.010513012297451496, + 0.010661989450454712, + 0.010686974972486496, + 0.010712018236517906, + 0.011361988261342049, + 0.012135962955653667, + 0.012933887541294098, + 0.013250667601823807, + 0.013575204648077488, + 0.013936679810285568, + 0.014426969923079014, + 0.014934507198631763, + 0.015521234832704067, + 0.01626010052859783, + 0.01703413762152195, + 0.017801333218812943, + 0.018546732142567635, + 0.01932334527373314, + 0.02027016133069992, + 0.021384356543421745, + 0.022559793666005135, + 0.023282889276742935, + 0.0237188171595335, + 0.024162903428077698, + 0.024822767823934555, + 0.02559511549770832, + 0.026391491293907166, + 0.02727353200316429, + 0.028206773102283478, + 0.02917194552719593, + 0.030019454658031464, + 0.030847083777189255, + 0.031697530299425125, + 0.032629285007715225, + 0.03360403701663017, + 0.0346079058945179, + 0.036378826946020126, + 0.03844671696424484, + 0.04063215106725693, + 0.041759807616472244, + 0.04257076233625412, + 0.04339747130870819, + 0.04494011774659157, + 0.04679560288786888, + 0.048727694898843765, + 0.04961257427930832, + 0.05000108852982521, + 0.050392650067806244, + 0.05192170292139053, + 0.05423003435134888, + 0.056640997529029846, + 0.0579870343208313, + 0.0583314374089241, + 0.05867788940668106, + 0.05900835618376732, + 0.059316541999578476, + 0.05962634086608887, + 0.060073982924222946, + 0.06083490327000618, + 0.061605457216501236, + 0.06238628178834915, + 0.06317954510450363, + 0.06398289650678635, + 0.06479515880346298, + 0.06551395356655121, + 0.06624072045087814, + 0.06697555631399155, + 0.06629101932048798, + 0.06534435600042343, + 0.0644112154841423, + 0.06398036330938339, + 0.06381993740797043, + 0.0636599212884903, + 0.0630718320608139, + 0.06194423511624336, + 0.0608367994427681, + 0.05974708870053291, + 0.05866914987564087, + 0.057610657066106796, + 0.05657125636935234, + 0.054444581270217896, + 0.052355460822582245, + 0.0503465011715889, + 0.04807104170322418, + 0.0457562617957592, + 0.0435529462993145, + 0.04174701124429703, + 0.0404154397547245, + 0.039126332849264145, + 0.037825483828783035, + 0.036164503544569016, + 0.03457646071910858, + 0.033058151602745056, + 0.03196454420685768, + 0.030998937785625458, + 0.03006250038743019, + 0.005780403967946768, + 0.005949411541223526, + 0.006058276165276766, + 0.006159108132123947, + 0.00628675427287817, + 0.0065793730318546295, + 0.0068856109865009785, + 0.007202674634754658, + 0.007528804242610931, + 0.007869699969887733, + 0.008217746391892433, + 0.008576164953410625, + 0.008950216695666313, + 0.009115581400692463, + 0.00924613792449236, + 0.009402922354638577, + 0.009927788749337196, + 0.01048195455223322, + 0.010946523398160934, + 0.011075782589614391, + 0.011206568218767643, + 0.01155636366456747, + 0.012216220609843731, + 0.01291375420987606, + 0.013330812565982342, + 0.013540328480303288, + 0.013753139413893223, + 0.014483559876680374, + 0.015448447316884995, + 0.016477614641189575, + 0.01698465831577778, + 0.017416512593626976, + 0.01785934343934059, + 0.018872888758778572, + 0.019955957308411598, + 0.02106868289411068, + 0.021833745762705803, + 0.022626589983701706, + 0.023550618439912796, + 0.025095485150814056, + 0.026741690933704376, + 0.028131574392318726, + 0.028271900489926338, + 0.02841292694211006, + 0.02876107022166252, + 0.029696281999349594, + 0.030661901459097862, + 0.0318981409072876, + 0.033781908452510834, + 0.035776928067207336, + 0.037564098834991455, + 0.03869007155299187, + 0.039849795401096344, + 0.0410514771938324, + 0.04230617359280586, + 0.04359922558069229, + 0.04480533301830292, + 0.04572229087352753, + 0.046658020466566086, + 0.04776681587100029, + 0.04938085377216339, + 0.051049429923295975, + 0.05265374109148979, + 0.05379544198513031, + 0.05496189370751381, + 0.056231316179037094, + 0.05810225382447243, + 0.060035448521375656, + 0.061971597373485565, + 0.06216847524046898, + 0.062365978956222534, + 0.06256411224603653, + 0.06252558529376984, + 0.06246844679117203, + 0.0624113567173481, + 0.06302143633365631, + 0.06380384415388107, + 0.06459596008062363, + 0.06501658260822296, + 0.06524431705474854, + 0.06547285616397858, + 0.06497178226709366, + 0.06376376748085022, + 0.06257820874452591, + 0.061782822012901306, + 0.06175945699214935, + 0.0617360956966877, + 0.061592236161231995, + 0.0606498122215271, + 0.05972180888056755, + 0.05880800634622574, + 0.05743173882365227, + 0.05604567378759384, + 0.054693061858415604, + 0.052984558045864105, + 0.051157813519239426, + 0.04939405247569084, + 0.04749405384063721, + 0.04542354866862297, + 0.043443307280540466, + 0.041636060923337936, + 0.04031597077846527, + 0.039037737995386124, + 0.037800028920173645, + 0.03677615895867348, + 0.0358026959002018, + 0.03485499694943428, + 0.03368481621146202, + 0.03238028660416603, + 0.031126273795962334, + 0.02983013167977333, + 0.028335023671388626, + 0.026914848014712334, + 0.005784578155726194, + 0.0061521949246525764, + 0.006342857610434294, + 0.006328601855784655, + 0.006314379163086414, + 0.006514031905680895, + 0.006793173495680094, + 0.007083939854055643, + 0.0073424275033175945, + 0.007610346656292677, + 0.007893561385571957, + 0.008204974234104156, + 0.008528674021363258, + 0.008783040568232536, + 0.008949353359639645, + 0.009118815883994102, + 0.009555124677717686, + 0.010149488225579262, + 0.010780823417007923, + 0.011215177364647388, + 0.011628505773842335, + 0.012055858969688416, + 0.01246678363531828, + 0.01289171352982521, + 0.013351085595786572, + 0.013911942951381207, + 0.01449635997414589, + 0.015115136280655861, + 0.015780331566929817, + 0.016474800184369087, + 0.017146706581115723, + 0.017782587558031082, + 0.018442053347826004, + 0.019763194024562836, + 0.021698184311389923, + 0.02382262796163559, + 0.02483547478914261, + 0.02523641288280487, + 0.02564382180571556, + 0.026144398376345634, + 0.026684802025556564, + 0.02723637782037258, + 0.02857930213212967, + 0.030186932533979416, + 0.031884994357824326, + 0.03411607816815376, + 0.03658523038029671, + 0.03923308849334717, + 0.039837516844272614, + 0.04015045240521431, + 0.04046585038304329, + 0.04219888150691986, + 0.04419059678912163, + 0.046276312321424484, + 0.046876996755599976, + 0.04728083312511444, + 0.04768814146518707, + 0.04946550354361534, + 0.051539346575737, + 0.05370013788342476, + 0.05558794364333153, + 0.057461176067590714, + 0.05939752608537674, + 0.06010136753320694, + 0.06041685491800308, + 0.06073400005698204, + 0.061416737735271454, + 0.06227215379476547, + 0.06313949078321457, + 0.06573321670293808, + 0.06965058296918869, + 0.07380141317844391, + 0.074886754155159, + 0.07265247404575348, + 0.07048485428094864, + 0.06833922117948532, + 0.06618679314851761, + 0.0641021654009819, + 0.06261775642633438, + 0.06305120885372162, + 0.06348765641450882, + 0.06383213400840759, + 0.06266377121210098, + 0.06151678413152695, + 0.06039079278707504, + 0.05810559540987015, + 0.05575234815478325, + 0.0534944087266922, + 0.05229536071419716, + 0.05157139524817467, + 0.05085745081305504, + 0.04988907277584076, + 0.04864346981048584, + 0.04742896929383278, + 0.04626084864139557, + 0.04517335444688797, + 0.044111426919698715, + 0.04307446628808975, + 0.04036960005760193, + 0.03780320659279823, + 0.03539995849132538, + 0.03401291370391846, + 0.0330253541469574, + 0.0320664644241333, + 0.030608901754021645, + 0.028540879487991333, + 0.026612581685185432, + 0.024979952722787857, + 0.0246896855533123, + 0.024402791634202003, + 0.02411922998726368, + 0.02276051975786686, + 0.021212654188275337, + 0.006468877661973238, + 0.0067587606608867645, + 0.007040046621114016, + 0.007219273131340742, + 0.007403061259537935, + 0.007654589135199785, + 0.00800190307199955, + 0.008364975452423096, + 0.008731508627533913, + 0.009107747115194798, + 0.009500198066234589, + 0.009761573746800423, + 0.010016391053795815, + 0.010302873328328133, + 0.010762080550193787, + 0.011241753585636616, + 0.011732379905879498, + 0.012223359197378159, + 0.012734887190163136, + 0.013233502395451069, + 0.013719946146011353, + 0.014224272221326828, + 0.014734356664121151, + 0.015257099643349648, + 0.015798388049006462, + 0.016748500987887383, + 0.01782505214214325, + 0.018970800563693047, + 0.01954427920281887, + 0.020134182646870613, + 0.020753907039761543, + 0.02148113027215004, + 0.022233838215470314, + 0.023099875077605247, + 0.024302320554852486, + 0.02556735835969448, + 0.0267979446798563, + 0.02786894328892231, + 0.02898274175822735, + 0.03023986518383026, + 0.03170757368206978, + 0.033246517181396484, + 0.03481737896800041, + 0.03640949726104736, + 0.038074418902397156, + 0.03966779261827469, + 0.04117480665445328, + 0.04273907095193863, + 0.04455125331878662, + 0.04661792144179344, + 0.04878045618534088, + 0.0507996492087841, + 0.052683066576719284, + 0.05463631451129913, + 0.055701009929180145, + 0.0559227429330349, + 0.05614536255598068, + 0.056896716356277466, + 0.058192312717437744, + 0.059517405927181244, + 0.06080599129199982, + 0.06204286217689514, + 0.06330488622188568, + 0.06437113881111145, + 0.06512164324522018, + 0.0658809021115303, + 0.06630805879831314, + 0.06603306531906128, + 0.06575921177864075, + 0.06558188050985336, + 0.06572073698043823, + 0.06585989147424698, + 0.0659046620130539, + 0.06526603549718857, + 0.06463359296321869, + 0.06400728225708008, + 0.0634622797369957, + 0.06292248517274857, + 0.06238727644085884, + 0.06095900014042854, + 0.059405647218227386, + 0.05789187178015709, + 0.05609733983874321, + 0.05421509966254234, + 0.052396010607481, + 0.05072127282619476, + 0.049180611968040466, + 0.04768674448132515, + 0.04611022770404816, + 0.04429982230067253, + 0.04256049916148186, + 0.04090287163853645, + 0.03945181518793106, + 0.038052238523960114, + 0.03670231252908707, + 0.03572503477334976, + 0.0348309725522995, + 0.033959291875362396, + 0.03248589113354683, + 0.030674174427986145, + 0.028963498771190643, + 0.027559993788599968, + 0.02665599435567856, + 0.025781648233532906, + 0.024927083402872086, + 0.023824812844395638, + 0.022771283984184265, + 0.021764341741800308, + 0.020746299996972084, + 0.01975535973906517, + 0.018811753019690514, + 0.018178492784500122, + 0.017970837652683258, + 0.00720080966129899, + 0.007336992304772139, + 0.007475750986486673, + 0.007749249693006277, + 0.008048306219279766, + 0.008339298889040947, + 0.00853778887540102, + 0.008741004392504692, + 0.009204811416566372, + 0.010089041665196419, + 0.011058214120566845, + 0.011760333552956581, + 0.01230295654386282, + 0.012870618142187595, + 0.012831957079470158, + 0.012698029167950153, + 0.012615651823580265, + 0.01323664654046297, + 0.013888209126889706, + 0.014575491659343243, + 0.015307980589568615, + 0.016077280044555664, + 0.01701810024678707, + 0.01820528507232666, + 0.019475290551781654, + 0.020373180508613586, + 0.02097148261964321, + 0.021587353199720383, + 0.022173386067152023, + 0.022756217047572136, + 0.023354368284344673, + 0.0243519339710474, + 0.025467365980148315, + 0.026633888483047485, + 0.02797621302306652, + 0.029393034055829048, + 0.03090709261596203, + 0.033150363713502884, + 0.035556454211473465, + 0.03789996728301048, + 0.03848326951265335, + 0.03907555341720581, + 0.03989233076572418, + 0.0418064147233963, + 0.0438123419880867, + 0.045728184282779694, + 0.04701291397213936, + 0.04833374172449112, + 0.050031546503305435, + 0.05294192209839821, + 0.05602159723639488, + 0.058639347553253174, + 0.05934414640069008, + 0.06005740910768509, + 0.06094539165496826, + 0.06240050494670868, + 0.06389036029577255, + 0.06521864235401154, + 0.06581355631351471, + 0.06641389429569244, + 0.06725022941827774, + 0.0692954882979393, + 0.07140294462442398, + 0.07311420887708664, + 0.07091948390007019, + 0.06879062950611115, + 0.06679746508598328, + 0.0675322487950325, + 0.06827510893344879, + 0.06902614235877991, + 0.06842641532421112, + 0.06773265451192856, + 0.0670459195971489, + 0.06440190225839615, + 0.06145003065466881, + 0.058633457869291306, + 0.056990206241607666, + 0.05586003512144089, + 0.054752275347709656, + 0.05324612185359001, + 0.05143551528453827, + 0.04968647658824921, + 0.04751390963792801, + 0.04467444494366646, + 0.04200466349720955, + 0.039755579084157944, + 0.03869369998574257, + 0.037660181522369385, + 0.0366542674601078, + 0.0352221243083477, + 0.03384127467870712, + 0.03251456469297409, + 0.030921192839741707, + 0.029315896332263947, + 0.02779393643140793, + 0.026636173948645592, + 0.025769313797354698, + 0.024930667132139206, + 0.02416970767080784, + 0.023560410365462303, + 0.022966472432017326, + 0.02238619141280651, + 0.021221326664090157, + 0.020117072388529778, + 0.019070280715823174, + 0.01856328174471855, + 0.018266918137669563, + 0.01797528751194477, + 0.01756538823246956, + 0.016984863206744194, + 0.016423523426055908, + 0.015850456431508064, + 0.014903800562024117, + 0.006133074872195721, + 0.006369170267134905, + 0.006614355370402336, + 0.006937646772712469, + 0.0073089394718408585, + 0.007700103335082531, + 0.007816092111170292, + 0.007920347154140472, + 0.008101276122033596, + 0.008592745289206505, + 0.009114029817283154, + 0.009519253857433796, + 0.00974745862185955, + 0.009981133043766022, + 0.010388510301709175, + 0.010906067676842213, + 0.011449410580098629, + 0.012347240000963211, + 0.013375876471400261, + 0.014441430568695068, + 0.014424926601350307, + 0.014408441260457039, + 0.014644714072346687, + 0.01588395982980728, + 0.01722807250916958, + 0.01839686557650566, + 0.019119689241051674, + 0.01987091451883316, + 0.020642682909965515, + 0.021435221657156944, + 0.02225819043815136, + 0.023503335192799568, + 0.025069257244467735, + 0.026739507913589478, + 0.028090825304389, + 0.029345091432332993, + 0.030655359849333763, + 0.03209052234888077, + 0.03360823169350624, + 0.03519771993160248, + 0.037182897329330444, + 0.03932126984000206, + 0.0415826141834259, + 0.04318143427371979, + 0.04479716718196869, + 0.04647335037589073, + 0.04775964096188545, + 0.04907582700252533, + 0.050434477627277374, + 0.05242414399981499, + 0.054492294788360596, + 0.05666019394993782, + 0.06002723053097725, + 0.06359435617923737, + 0.06737042963504791, + 0.07084941118955612, + 0.07450804859399796, + 0.07835561037063599, + 0.07978446781635284, + 0.08118149638175964, + 0.08260297775268555, + 0.08264987915754318, + 0.08259814977645874, + 0.08254644274711609, + 0.08229230344295502, + 0.08200927078723907, + 0.08172722160816193, + 0.07928045839071274, + 0.07636617869138718, + 0.07355903089046478, + 0.07287478446960449, + 0.07308895885944366, + 0.07330377399921417, + 0.07083631306886673, + 0.06664780527353287, + 0.06270696967840195, + 0.05923106521368027, + 0.05621638149023056, + 0.0533551387488842, + 0.05065558850765228, + 0.04812803864479065, + 0.045726604759693146, + 0.043396759778261185, + 0.0408913716673851, + 0.0385306254029274, + 0.036306168884038925, + 0.034218937158584595, + 0.03225214406847954, + 0.030398394912481308, + 0.02878047712147236, + 0.027290359139442444, + 0.025877390056848526, + 0.02452687732875347, + 0.023237694054841995, + 0.02201627381145954, + 0.02096494846045971, + 0.020217031240463257, + 0.01949579454958439, + 0.018794376403093338, + 0.017930850386619568, + 0.017107000574469566, + 0.016321003437042236, + 0.015622148290276527, + 0.01496920920908451, + 0.014343560673296452, + 0.01381079200655222, + 0.013373741880059242, + 0.012950521893799305, + 0.012567059136927128, + 0.012344436720013618, + 0.012125757522881031, + 0.011910953558981419, + 0.01131297368556261, + 0.004233246669173241, + 0.004455256275832653, + 0.004688908811658621, + 0.004864939488470554, + 0.004987856838852167, + 0.0051138801500201225, + 0.005353025626391172, + 0.005631068721413612, + 0.005920872092247009, + 0.006177661474794149, + 0.006445588078349829, + 0.006679285783320665, + 0.006804964505136013, + 0.006933007854968309, + 0.007206946611404419, + 0.007641735952347517, + 0.00810275599360466, + 0.00847612414509058, + 0.008816434070467949, + 0.009170404635369778, + 0.009666143916547298, + 0.010205601342022419, + 0.01077292114496231, + 0.011333317495882511, + 0.011922863312065601, + 0.012509339489042759, + 0.0129930404946208, + 0.013495447114109993, + 0.01418547984212637, + 0.015248018316924572, + 0.01639014482498169, + 0.017400141805410385, + 0.018213815987110138, + 0.01906553842127323, + 0.020457306876778603, + 0.022359073162078857, + 0.024437634274363518, + 0.025656254962086678, + 0.026386599987745285, + 0.02713773399591446, + 0.028369175270199776, + 0.0298329908400774, + 0.03137233853340149, + 0.03361954540014267, + 0.03621045872569084, + 0.039001040160655975, + 0.04094880074262619, + 0.0427655465900898, + 0.04466289281845093, + 0.04763118922710419, + 0.050985824316740036, + 0.05457673221826553, + 0.05892783775925636, + 0.06371956318616867, + 0.068900927901268, + 0.07502306997776031, + 0.08179508149623871, + 0.08917836099863052, + 0.09669584035873413, + 0.10471580922603607, + 0.11340095102787018, + 0.11532467603683472, + 0.11508166790008545, + 0.11483917385339737, + 0.11343840509653091, + 0.1115807518362999, + 0.10975351184606552, + 0.10746690630912781, + 0.1049422025680542, + 0.1024768128991127, + 0.09804927557706833, + 0.09211861342191696, + 0.08654668182134628, + 0.08078183978796005, + 0.07470375299453735, + 0.06908298283815384, + 0.06397584825754166, + 0.05946227163076401, + 0.05526713654398918, + 0.05107077583670616, + 0.045401379466056824, + 0.04036134481430054, + 0.03588080778717995, + 0.032996177673339844, + 0.030383573845028877, + 0.0279778353869915, + 0.026302581652998924, + 0.02487560734152794, + 0.02352604828774929, + 0.021954629570245743, + 0.020285246893763542, + 0.01874280348420143, + 0.017488572746515274, + 0.016617322340607643, + 0.015789473429322243, + 0.014964860863983631, + 0.013898133300244808, + 0.01290744449943304, + 0.011987372301518917, + 0.011538106016814709, + 0.01117443572729826, + 0.010822228156030178, + 0.010406175628304482, + 0.009953437373042107, + 0.0095203947275877, + 0.009133906103670597, + 0.008831479586660862, + 0.008539066649973392, + 0.008256334811449051, + 0.007846435531973839, + 0.007452556397765875, + 0.007078448310494423, + 0.006769554689526558, + 0.0033963890746235847, + 0.003501147497445345, + 0.003609138075262308, + 0.003752022283151746, + 0.003939993213862181, + 0.004137381911277771, + 0.004379547666758299, + 0.004650413524359465, + 0.004938031546771526, + 0.0049995542503893375, + 0.005053307395428419, + 0.00513495784252882, + 0.005332505330443382, + 0.005537652410566807, + 0.0058075240813195705, + 0.006176293827593327, + 0.00656847981736064, + 0.006910017691552639, + 0.007219590246677399, + 0.007543031591922045, + 0.007782308850437403, + 0.008003512397408485, + 0.00823100283741951, + 0.00897966232150793, + 0.009816931560635567, + 0.010648536495864391, + 0.010895154438912868, + 0.011147485114634037, + 0.011490578763186932, + 0.012104191817343235, + 0.01275057252496481, + 0.013525839895009995, + 0.014516690745949745, + 0.015580128878355026, + 0.016486484557390213, + 0.01717902347445488, + 0.017900653183460236, + 0.018885711207985878, + 0.020115135237574577, + 0.021424589678645134, + 0.023047136142849922, + 0.024932758882641792, + 0.026972655206918716, + 0.028443096205592155, + 0.029655594378709793, + 0.030919784680008888, + 0.032879386097192764, + 0.035217687487602234, + 0.03772228583693504, + 0.041679747402668, + 0.04652561619877815, + 0.05193489044904709, + 0.057258449494838715, + 0.06287693232297897, + 0.06904672831296921, + 0.07915148884057999, + 0.09208060055971146, + 0.10712164640426636, + 0.1180669441819191, + 0.1273680478334427, + 0.13740186393260956, + 0.1408662497997284, + 0.14083124697208405, + 0.1407962441444397, + 0.1376744508743286, + 0.13269515335559845, + 0.12789592146873474, + 0.12252634763717651, + 0.11674191057682037, + 0.11123055964708328, + 0.10446906089782715, + 0.09624864906072617, + 0.08867509663105011, + 0.08113013207912445, + 0.07309375703334808, + 0.06585341691970825, + 0.05941253527998924, + 0.05394423007965088, + 0.048979226499795914, + 0.044450391083955765, + 0.03968696668744087, + 0.03543400391936302, + 0.0316368006169796, + 0.028466375544667244, + 0.02564619667828083, + 0.02310541272163391, + 0.02155543491244316, + 0.020453302189707756, + 0.019407521933317184, + 0.018292350694537163, + 0.017110880464315414, + 0.01600572094321251, + 0.01493709534406662, + 0.013840705156326294, + 0.012824791483581066, + 0.011884460225701332, + 0.011182012967765331, + 0.010521084070205688, + 0.009899221360683441, + 0.00952521525323391, + 0.009235268458724022, + 0.00895414873957634, + 0.00867356825619936, + 0.008393014781177044, + 0.008121537044644356, + 0.0078070866875350475, + 0.0072728171944618225, + 0.006775110960006714, + 0.006311463657766581, + 0.006134265102446079, + 0.006003487855195999, + 0.0058754985220730305, + 0.005712558981031179, + 0.004972338676452637, + 0.005207051523029804, + 0.005452843848615885, + 0.005649099592119455, + 0.005768472794443369, + 0.005890368949621916, + 0.006025294307619333, + 0.006168140564113855, + 0.006314373109489679, + 0.0065733520314097404, + 0.00685081398114562, + 0.007129596546292305, + 0.007366065867245197, + 0.007610378786921501, + 0.007893078960478306, + 0.008237192407250404, + 0.008596308529376984, + 0.00898826215416193, + 0.009410976432263851, + 0.009853571653366089, + 0.01045775506645441, + 0.011144823394715786, + 0.011877031065523624, + 0.012372009456157684, + 0.012867220677435398, + 0.01339010987430811, + 0.01401998195797205, + 0.014679483138024807, + 0.01533688697963953, + 0.015904156491160393, + 0.016492407768964767, + 0.017238769680261612, + 0.018294205889105797, + 0.0194142647087574, + 0.020374026149511337, + 0.021088412031531334, + 0.021827848628163338, + 0.022875914350152016, + 0.024234773591160774, + 0.025674346834421158, + 0.027124455198645592, + 0.02860511653125286, + 0.03016660362482071, + 0.0317823700606823, + 0.033467940986156464, + 0.03524290770292282, + 0.037265412509441376, + 0.03947409614920616, + 0.0418136864900589, + 0.04455423727631569, + 0.04758350923657417, + 0.05081874504685402, + 0.05472782254219055, + 0.05912446975708008, + 0.06387433409690857, + 0.06942800432443619, + 0.07565082609653473, + 0.08243139088153839, + 0.08881805837154388, + 0.09520234167575836, + 0.10204552114009857, + 0.1073966696858406, + 0.11185242980718613, + 0.11649304628372192, + 0.11701797693967819, + 0.11441770941019058, + 0.11187523603439331, + 0.11003762483596802, + 0.10889291018247604, + 0.10776010155677795, + 0.10400152951478958, + 0.09657549113035202, + 0.08967970311641693, + 0.08327286690473557, + 0.07731548696756363, + 0.07178429514169693, + 0.06639488786458969, + 0.06003908812999725, + 0.05429171770811081, + 0.04909452050924301, + 0.045804690569639206, + 0.04274382442235947, + 0.03988749906420708, + 0.03676130995154381, + 0.03379072993993759, + 0.031060192734003067, + 0.02844315581023693, + 0.025991206988692284, + 0.023750627413392067, + 0.02211914025247097, + 0.021116385236382484, + 0.02015908807516098, + 0.01923305168747902, + 0.018306348472833633, + 0.01742429845035076, + 0.016584748402237892, + 0.01571018248796463, + 0.014879562892019749, + 0.014092858880758286, + 0.013364567421376705, + 0.012680388987064362, + 0.012031236663460732, + 0.0114282900467515, + 0.01087165530771017, + 0.010342133231461048, + 0.00986538641154766, + 0.009572894312441349, + 0.009289073757827282, + 0.00901366863399744, + 0.00872021820396185, + 0.008430900983512402, + 0.008151182904839516, + 0.007897076196968555, + 0.008043580688536167, + 0.008438143879175186, + 0.008852059952914715, + 0.009193604812026024, + 0.009434983134269714, + 0.009682698175311089, + 0.009877658449113369, + 0.010052998550236225, + 0.010231451131403446, + 0.010786193422973156, + 0.011385208927094936, + 0.01200010534375906, + 0.012573868967592716, + 0.01317506842315197, + 0.013661113567650318, + 0.013955650851130486, + 0.014256537891924381, + 0.01501548383384943, + 0.0161226075142622, + 0.01731136068701744, + 0.017609549686312675, + 0.017668435350060463, + 0.017727522179484367, + 0.018733128905296326, + 0.01983218640089035, + 0.020929181948304176, + 0.02157011069357395, + 0.022230666130781174, + 0.02292017452418804, + 0.023657411336898804, + 0.024418359622359276, + 0.025465672835707664, + 0.027019523084163666, + 0.02866818569600582, + 0.02976430580019951, + 0.030181147158145905, + 0.03060382604598999, + 0.03203703090548515, + 0.034364521503448486, + 0.036861106753349304, + 0.03978155925869942, + 0.04308265075087547, + 0.04665766656398773, + 0.046127062290906906, + 0.04379552975296974, + 0.04158185049891472, + 0.04248183220624924, + 0.04458792507648468, + 0.046798430383205414, + 0.048739995807409286, + 0.0506330206990242, + 0.05259957164525986, + 0.05422646552324295, + 0.055766742676496506, + 0.057350773364305496, + 0.059725742787122726, + 0.062467414885759354, + 0.06533493846654892, + 0.06765386462211609, + 0.0697772279381752, + 0.0719672366976738, + 0.07241692394018173, + 0.07198690623044968, + 0.07155944406986237, + 0.07245098799467087, + 0.07423337548971176, + 0.07605960965156555, + 0.07673712074756622, + 0.07634837180376053, + 0.07596158981323242, + 0.07506114989519119, + 0.07349377870559692, + 0.07195913791656494, + 0.07077296078205109, + 0.0702984631061554, + 0.0698271319270134, + 0.06807535886764526, + 0.06090410053730011, + 0.054488278925418854, + 0.04888122156262398, + 0.04822191968560219, + 0.04757151007652283, + 0.046929869800806046, + 0.042875029146671295, + 0.03868133947253227, + 0.03489784523844719, + 0.03291114419698715, + 0.031713277101516724, + 0.030559008941054344, + 0.029293600469827652, + 0.027915045619010925, + 0.026601362973451614, + 0.025546912103891373, + 0.02512405812740326, + 0.024708202108740807, + 0.024295177310705185, + 0.02318977378308773, + 0.02213466539978981, + 0.02112756110727787, + 0.020099444314837456, + 0.019099842756986618, + 0.018149957060813904, + 0.017581723630428314, + 0.017404820770025253, + 0.017229696735739708, + 0.01694609597325325, + 0.016161378473043442, + 0.01541300117969513, + 0.014699277468025684, + 0.014226041734218597, + 0.013801117427647114, + 0.013388886116445065, + 0.013114754110574722, + 0.010733001865446568, + 0.01137245912104845, + 0.012050015851855278, + 0.012593156658113003, + 0.013010245747864246, + 0.013441148214042187, + 0.013646678067743778, + 0.01379812229424715, + 0.01397982519119978, + 0.014667315408587456, + 0.015388614498078823, + 0.016041917726397514, + 0.016458304598927498, + 0.01688549853861332, + 0.01747290790081024, + 0.018234195187687874, + 0.01902865059673786, + 0.02012144960463047, + 0.021395284682512283, + 0.0227497611194849, + 0.0235692597925663, + 0.02433912642300129, + 0.025109518319368362, + 0.025494467467069626, + 0.025885315611958504, + 0.026490967720746994, + 0.02792564406991005, + 0.029438020661473274, + 0.030913814902305603, + 0.03223158419132233, + 0.03360552340745926, + 0.034800417721271515, + 0.03576083853840828, + 0.0367477685213089, + 0.03785206750035286, + 0.039058834314346313, + 0.040304072201251984, + 0.04138047620654106, + 0.042376428842544556, + 0.04339636117219925, + 0.045089609920978546, + 0.04709663242101669, + 0.04919298365712166, + 0.05061858892440796, + 0.05187670886516571, + 0.05316609889268875, + 0.053373783826828, + 0.05335179716348648, + 0.05332982540130615, + 0.05424276366829872, + 0.055341824889183044, + 0.05646315589547157, + 0.056769177317619324, + 0.05693463981151581, + 0.057100582867860794, + 0.05703405663371086, + 0.056924328207969666, + 0.05681481584906578, + 0.05669783800840378, + 0.0565793551504612, + 0.05646112188696861, + 0.056510183960199356, + 0.05660974606871605, + 0.05670948699116707, + 0.05719742551445961, + 0.0578535720705986, + 0.058517247438430786, + 0.05843472480773926, + 0.05790635198354721, + 0.05738275498151779, + 0.05580400675535202, + 0.05336374044418335, + 0.05103018879890442, + 0.049592725932598114, + 0.049313805997371674, + 0.04903645068407059, + 0.048222772777080536, + 0.046092599630355835, + 0.044056523591279984, + 0.04218045994639397, + 0.04083463177084923, + 0.03953174501657486, + 0.03827042877674103, + 0.03730152174830437, + 0.036366771906614304, + 0.03545544669032097, + 0.03459850698709488, + 0.03377114236354828, + 0.03296355903148651, + 0.032215628772974014, + 0.03151409700512886, + 0.03082784079015255, + 0.02999867871403694, + 0.028909923508763313, + 0.02786068618297577, + 0.026889760047197342, + 0.02626570127904415, + 0.02565612643957138, + 0.02506069839000702, + 0.024240627884864807, + 0.023407798260450363, + 0.022603582590818405, + 0.022173207253217697, + 0.02200428396463394, + 0.021836647763848305, + 0.0214593093842268, + 0.020567312836647034, + 0.01971239410340786, + 0.018893009051680565, + 0.01865692436695099, + 0.018442336469888687, + 0.018230216577649117, + 0.017644908279180527, + 0.011851268820464611, + 0.012493478134274483, + 0.013170487247407436, + 0.013515690341591835, + 0.013705328106880188, + 0.013897626660764217, + 0.014330128207802773, + 0.01478738896548748, + 0.015249667689204216, + 0.01568806730210781, + 0.016139071434736252, + 0.016624456271529198, + 0.01715286821126938, + 0.017698073759675026, + 0.01857982948422432, + 0.019684849306941032, + 0.02085559070110321, + 0.021892866119742393, + 0.02294601872563362, + 0.024060584604740143, + 0.025490839034318924, + 0.027006108313798904, + 0.028358010575175285, + 0.028805093839764595, + 0.029259229078888893, + 0.029951587319374084, + 0.031075894832611084, + 0.03224240615963936, + 0.03346928581595421, + 0.03475986048579216, + 0.036100197583436966, + 0.03756071254611015, + 0.039123184978961945, + 0.040750652551651, + 0.04162082076072693, + 0.04220223426818848, + 0.04279177263379097, + 0.04486845061182976, + 0.04739514738321304, + 0.05006413534283638, + 0.05164153873920441, + 0.05311548709869385, + 0.05463150143623352, + 0.054186008870601654, + 0.053637515753507614, + 0.05309457704424858, + 0.054517388343811035, + 0.0560036301612854, + 0.05750162899494171, + 0.05636776238679886, + 0.055256254971027374, + 0.05419024080038071, + 0.05451272800564766, + 0.05483713001012802, + 0.055154949426651, + 0.054095249623060226, + 0.053055912256240845, + 0.05203654244542122, + 0.052031587809324265, + 0.05204881727695465, + 0.052066050469875336, + 0.05095275491476059, + 0.049785517156124115, + 0.04864501953125, + 0.04814675822854042, + 0.0477440319955349, + 0.047344665974378586, + 0.04668249562382698, + 0.04596111178398132, + 0.04525088518857956, + 0.0450393408536911, + 0.045042552053928375, + 0.04504575952887535, + 0.04504457116127014, + 0.04504021257162094, + 0.04503585398197174, + 0.044541407376527786, + 0.043467890471220016, + 0.04242023825645447, + 0.0411941334605217, + 0.039548054337501526, + 0.037967752665281296, + 0.036569420248270035, + 0.03597036004066467, + 0.03538111224770546, + 0.03480151668190956, + 0.03414681926369667, + 0.033500008285045624, + 0.03286544978618622, + 0.03255870193243027, + 0.03236173465847969, + 0.03216595947742462, + 0.03157009556889534, + 0.03063408099114895, + 0.0297258198261261, + 0.029033638536930084, + 0.02882268838584423, + 0.028613271191716194, + 0.02838832512497902, + 0.02761167846620083, + 0.026856279000639915, + 0.02612154744565487, + 0.025371287018060684, + 0.024631284177303314, + 0.023912861943244934, + 0.023284291848540306, + 0.02275135926902294, + 0.02223062701523304, + 0.02174319140613079, + 0.021388188004493713, + 0.021038983017206192, + 0.020695475861430168, + 0.02015419490635395, + 0.011842269450426102, + 0.012037706561386585, + 0.012236367911100388, + 0.012780806049704552, + 0.013390320353209972, + 0.014018894173204899, + 0.014623570255935192, + 0.015254328027367592, + 0.01573559269309044, + 0.01597662828862667, + 0.01622135564684868, + 0.016878975555300713, + 0.01779988221824169, + 0.018771033734083176, + 0.01930868625640869, + 0.019785016775131226, + 0.020288599655032158, + 0.021023904904723167, + 0.021785860881209373, + 0.022724531590938568, + 0.024164121598005295, + 0.025694910436868668, + 0.02703848108649254, + 0.02805413492023945, + 0.029107939451932907, + 0.02987038530409336, + 0.030410161241889, + 0.03095969185233116, + 0.03199680894613266, + 0.033262643963098526, + 0.034578558057546616, + 0.03578269109129906, + 0.036997240036726, + 0.03825301676988602, + 0.039920710027217865, + 0.041681673377752304, + 0.043546780943870544, + 0.04616539552807808, + 0.0489414818584919, + 0.05148417875170708, + 0.05099092423915863, + 0.050502385944128036, + 0.050171609967947006, + 0.050584957003593445, + 0.051001712679862976, + 0.051585253328084946, + 0.05279324948787689, + 0.05402952805161476, + 0.05460923910140991, + 0.05301518738269806, + 0.051467668265104294, + 0.050487369298934937, + 0.05114823579788208, + 0.051817748695611954, + 0.05212831869721413, + 0.051250215619802475, + 0.050386909395456314, + 0.049876317381858826, + 0.05066700279712677, + 0.05147021636366844, + 0.0517321340739727, + 0.04925612360239029, + 0.04689861834049225, + 0.04476173594594002, + 0.04362048581242561, + 0.0425083264708519, + 0.04146092012524605, + 0.041793808341026306, + 0.04212936386466026, + 0.0424676239490509, + 0.04139942675828934, + 0.04025764763355255, + 0.039147354662418365, + 0.03904727101325989, + 0.03916821628808975, + 0.03928954154253006, + 0.039091505110263824, + 0.038750894367694855, + 0.03841324895620346, + 0.038279928267002106, + 0.0383189432322979, + 0.03835800290107727, + 0.038154177367687225, + 0.037550847977399826, + 0.03695705905556679, + 0.03645668551325798, + 0.03631683811545372, + 0.03617752343416214, + 0.03603874519467354, + 0.036016520112752914, + 0.03599555790424347, + 0.03597461059689522, + 0.03587232157588005, + 0.03574610874056816, + 0.03562033548951149, + 0.034864697605371475, + 0.03359184041619301, + 0.03236544877290726, + 0.03152788057923317, + 0.031607333570718765, + 0.03168698400259018, + 0.03176701441407204, + 0.03193264454603195, + 0.03209913894534111, + 0.03226650133728981, + 0.03179623931646347, + 0.03107869066298008, + 0.030377335846424103, + 0.029748182743787766, + 0.029215700924396515, + 0.02869275026023388, + 0.028165115043520927, + 0.027459582313895226, + 0.011147454380989075, + 0.011626997031271458, + 0.01210516132414341, + 0.012486613355576992, + 0.012880084104835987, + 0.01334677916020155, + 0.013914349488914013, + 0.014506055973470211, + 0.014996558427810669, + 0.015442832373082638, + 0.015902385115623474, + 0.016196509823203087, + 0.01647954247891903, + 0.016838576644659042, + 0.017672788351774216, + 0.018548328429460526, + 0.019368568435311317, + 0.02002694644033909, + 0.02070770226418972, + 0.021492784842848778, + 0.02238296903669834, + 0.023310022428631783, + 0.024452591314911842, + 0.02573067508637905, + 0.02707556262612343, + 0.027518462389707565, + 0.027808353304862976, + 0.028101297095417976, + 0.029917726293206215, + 0.03185387700796127, + 0.03382783383131027, + 0.03526910021901131, + 0.03677177429199219, + 0.03811860457062721, + 0.038766685873270035, + 0.03942578285932541, + 0.04003463312983513, + 0.040522534400224686, + 0.04101638123393059, + 0.04171544313430786, + 0.042733658105134964, + 0.0437767319381237, + 0.044529832899570465, + 0.044918954372406006, + 0.04531148076057434, + 0.04574685916304588, + 0.046226195991039276, + 0.046710558235645294, + 0.04710673540830612, + 0.04742174595594406, + 0.04773886501789093, + 0.047849249094724655, + 0.04777885228395462, + 0.04770856350660324, + 0.046967994421720505, + 0.04565545916557312, + 0.04437960311770439, + 0.043494872748851776, + 0.042975299060344696, + 0.04246193543076515, + 0.04222104698419571, + 0.042293500155210495, + 0.04236608371138573, + 0.042014166712760925, + 0.041046254336833954, + 0.040100645273923874, + 0.03934035450220108, + 0.03892878443002701, + 0.03852152079343796, + 0.03822777792811394, + 0.03829718753695488, + 0.03836672008037567, + 0.038468580693006516, + 0.03880581259727478, + 0.039145998656749725, + 0.03948916122317314, + 0.039401616901159286, + 0.039311040192842484, + 0.03922067582607269, + 0.03913300111889839, + 0.039045967161655426, + 0.03895913064479828, + 0.039124611765146255, + 0.039409130811691284, + 0.03969572111964226, + 0.04015430808067322, + 0.04079027101397514, + 0.04143630340695381, + 0.04214143753051758, + 0.04297414422035217, + 0.043823305517435074, + 0.044564198702573776, + 0.0439421683549881, + 0.04332881420850754, + 0.04272402450442314, + 0.042963363230228424, + 0.04335705190896988, + 0.043754350394010544, + 0.04358917474746704, + 0.04304232820868492, + 0.04250234365463257, + 0.0418480820953846, + 0.04095283895730972, + 0.04007675126194954, + 0.03925080597400665, + 0.03944789990782738, + 0.03964598849415779, + 0.039845071732997894, + 0.039106130599975586, + 0.03802945464849472, + 0.03698241710662842, + 0.036006078124046326, + 0.0351187027990818, + 0.007988096214830875, + 0.008400660008192062, + 0.00878929439932108, + 0.009146287105977535, + 0.009517780505120754, + 0.009996162727475166, + 0.01053006574511528, + 0.01109069213271141, + 0.011443393304944038, + 0.01180731225758791, + 0.012210973538458347, + 0.012718604877591133, + 0.013247339054942131, + 0.013797231949865818, + 0.014368971809744835, + 0.014964405447244644, + 0.015509138815104961, + 0.01603584550321102, + 0.016580436378717422, + 0.01735135167837143, + 0.01819285750389099, + 0.019062401726841927, + 0.019632987678050995, + 0.020220652222633362, + 0.02087198570370674, + 0.021740518510341644, + 0.022645194083452225, + 0.023474156856536865, + 0.024105465039610863, + 0.02475374937057495, + 0.02553708292543888, + 0.02648555301129818, + 0.027469249442219734, + 0.028545569628477097, + 0.029707208275794983, + 0.030916117131710052, + 0.031743571162223816, + 0.03237651661038399, + 0.03302208334207535, + 0.034521590918302536, + 0.036392852663993835, + 0.038365550339221954, + 0.039599984884262085, + 0.04066884517669678, + 0.04176655411720276, + 0.04194498434662819, + 0.041960764676332474, + 0.041976552456617355, + 0.041271355003118515, + 0.04048202186822891, + 0.039707791060209274, + 0.03979425132274628, + 0.03998612239956856, + 0.04017891734838486, + 0.040191639214754105, + 0.040180884301662445, + 0.04017013683915138, + 0.03981533274054527, + 0.03940942883491516, + 0.03900766745209694, + 0.03852459043264389, + 0.03802930563688278, + 0.037540387362241745, + 0.037770744413137436, + 0.038225024938583374, + 0.038684770464897156, + 0.03832126408815384, + 0.03760027512907982, + 0.0368928499519825, + 0.03675496578216553, + 0.036991994827985764, + 0.037230558693408966, + 0.03764793276786804, + 0.038256775587797165, + 0.03887546434998512, + 0.039399486035108566, + 0.03974626213312149, + 0.040096089243888855, + 0.04055103659629822, + 0.041378285735845566, + 0.042222410440444946, + 0.043147534132003784, + 0.04515301436185837, + 0.04725171625614166, + 0.04944796487689018, + 0.04996660724282265, + 0.05024797469377518, + 0.05053093284368515, + 0.05091577768325806, + 0.051350872963666916, + 0.05178968608379364, + 0.0523703470826149, + 0.05311811715364456, + 0.05387656018137932, + 0.05473991483449936, + 0.055934514850378036, + 0.05715518817305565, + 0.058402497321367264, + 0.05709269270300865, + 0.05576234683394432, + 0.05446299910545349, + 0.05401147902011871, + 0.05389853194355965, + 0.05378582328557968, + 0.05343770235776901, + 0.052771829068660736, + 0.052114252001047134, + 0.05140027776360512, + 0.05020378530025482, + 0.04903514310717583, + 0.0478937067091465, + 0.04628841578960419, + 0.04461033642292023, + 0.006225239019840956, + 0.006689494475722313, + 0.006848279852420092, + 0.0069593102671206, + 0.007117432542145252, + 0.007574744522571564, + 0.008061440661549568, + 0.00847714301198721, + 0.008750797249376774, + 0.00903328601270914, + 0.009588450193405151, + 0.010343831032514572, + 0.011158721521496773, + 0.01178185548633337, + 0.012395059689879417, + 0.0130001874640584, + 0.013042575679719448, + 0.013085102662444115, + 0.013306396082043648, + 0.014070077799260616, + 0.014877589419484138, + 0.015584650449454784, + 0.01612679287791252, + 0.016687795519828796, + 0.01750657707452774, + 0.018537957221269608, + 0.019630098715424538, + 0.020312661305069923, + 0.020848726853728294, + 0.021398937329649925, + 0.022425446659326553, + 0.023575685918331146, + 0.02478492446243763, + 0.025392530485987663, + 0.026001615449786186, + 0.02666756510734558, + 0.027878711000084877, + 0.029144858941435814, + 0.030398445203900337, + 0.031314533203840256, + 0.03225822374224663, + 0.03340277448296547, + 0.03522947058081627, + 0.037156056612730026, + 0.038728199899196625, + 0.03907687962055206, + 0.039428696036338806, + 0.03940308466553688, + 0.03849002346396446, + 0.03759812191128731, + 0.03701479732990265, + 0.0370793342590332, + 0.03714398667216301, + 0.037368204444646835, + 0.03795916587114334, + 0.03855947032570839, + 0.03886890038847923, + 0.03843575716018677, + 0.03800743445754051, + 0.03766658902168274, + 0.037577368319034576, + 0.037488363683223724, + 0.03741081431508064, + 0.03737998753786087, + 0.03734918683767319, + 0.0374072901904583, + 0.038109056651592255, + 0.038823992013931274, + 0.03952198475599289, + 0.0393507182598114, + 0.03918019309639931, + 0.039010412991046906, + 0.03996266424655914, + 0.04103000834584236, + 0.04212585836648941, + 0.04381773620843887, + 0.04572337120771408, + 0.04771188274025917, + 0.04758817330002785, + 0.04637988284230232, + 0.04520227015018463, + 0.04546455666422844, + 0.0471794530749321, + 0.04895903915166855, + 0.05065371096134186, + 0.052081819623708725, + 0.05355018749833107, + 0.054780762642621994, + 0.054164428263902664, + 0.05355503037571907, + 0.05295248702168465, + 0.05447230488061905, + 0.05623737350106239, + 0.05805963650345802, + 0.060430120676755905, + 0.0631321594119072, + 0.0659550130367279, + 0.06648899614810944, + 0.06400804221630096, + 0.06161965802311897, + 0.059773825109004974, + 0.060201097279787064, + 0.06063142418861389, + 0.06106482446193695, + 0.0596202127635479, + 0.0579695925116539, + 0.05636466667056084, + 0.05425909161567688, + 0.05185222998261452, + 0.049552131444215775, + 0.04737620800733566, + 0.04535786807537079, + 0.043425511568784714, + 0.007532087620347738, + 0.00790923647582531, + 0.008203688077628613, + 0.008509102277457714, + 0.009018363431096077, + 0.009709076955914497, + 0.010452690534293652, + 0.010716816410422325, + 0.010883331298828125, + 0.01106676273047924, + 0.011425485834479332, + 0.011795838363468647, + 0.012223204597830772, + 0.012772989459335804, + 0.013347501866519451, + 0.013849925249814987, + 0.014276492409408092, + 0.014716197736561298, + 0.015378104522824287, + 0.016159361228346825, + 0.016980310901999474, + 0.017632918432354927, + 0.018283823505043983, + 0.018991269171237946, + 0.020335806533694267, + 0.021775534376502037, + 0.023157307878136635, + 0.023960798978805542, + 0.024792170152068138, + 0.025568794459104538, + 0.026197059080004692, + 0.026840757578611374, + 0.027624517679214478, + 0.028590211644768715, + 0.029589662328362465, + 0.030805829912424088, + 0.03223037347197533, + 0.033720798790454865, + 0.03456910699605942, + 0.035014208406209946, + 0.03546503931283951, + 0.03587063029408455, + 0.036258142441511154, + 0.03664983808994293, + 0.037160079926252365, + 0.037717461585998535, + 0.038283202797174454, + 0.03907734155654907, + 0.03995282202959061, + 0.04084791988134384, + 0.04083651676774025, + 0.04058608040213585, + 0.040337175130844116, + 0.0403408482670784, + 0.04041079431772232, + 0.040480855852365494, + 0.04086659103631973, + 0.0413493849337101, + 0.04183788225054741, + 0.04185444861650467, + 0.04170399159193039, + 0.04155407100915909, + 0.04213481396436691, + 0.04306403547525406, + 0.044013746082782745, + 0.044439710676670074, + 0.04453437402844429, + 0.04462924227118492, + 0.04463806748390198, + 0.044571325182914734, + 0.04450467973947525, + 0.04473791643977165, + 0.04537680745124817, + 0.04602482542395592, + 0.04656681790947914, + 0.04685386270284653, + 0.04714267700910568, + 0.04747847840189934, + 0.0480412133038044, + 0.0486106239259243, + 0.04918564856052399, + 0.04967772960662842, + 0.05017473176121712, + 0.05067670717835426, + 0.050652917474508286, + 0.050527431070804596, + 0.05040225386619568, + 0.05069388449192047, + 0.05121806636452675, + 0.05174766480922699, + 0.05155467614531517, + 0.050438977777957916, + 0.04934742674231529, + 0.048855189234018326, + 0.05060461536049843, + 0.052416689693927765, + 0.05429365113377571, + 0.053270675241947174, + 0.0521530918776989, + 0.05105895549058914, + 0.0502338632941246, + 0.04952792823314667, + 0.048831917345523834, + 0.0480075404047966, + 0.047005072236061096, + 0.04602353647351265, + 0.04495367035269737, + 0.04307350888848305, + 0.041271984577178955, + 0.03954580798745155, + 0.03816927224397659, + 0.0369115024805069, + 0.03569518029689789, + 0.009821363724768162, + 0.010086305439472198, + 0.010288791730999947, + 0.010495344176888466, + 0.01101258210837841, + 0.011767027899622917, + 0.012573158368468285, + 0.01243224274367094, + 0.01214652694761753, + 0.011945197358727455, + 0.012396790087223053, + 0.012865456752479076, + 0.013350742869079113, + 0.013852070085704327, + 0.014372222125530243, + 0.01491251029074192, + 0.015473632141947746, + 0.016055867075920105, + 0.01644871197640896, + 0.01677614636719227, + 0.017110100015997887, + 0.01728508621454239, + 0.017447454854846, + 0.01764611341059208, + 0.018235880881547928, + 0.01884535513818264, + 0.01944858580827713, + 0.019980132579803467, + 0.020526207983493805, + 0.02115037851035595, + 0.021908340975642204, + 0.022693466395139694, + 0.023411346599459648, + 0.024044932797551155, + 0.024695666506886482, + 0.02533319592475891, + 0.025964034721255302, + 0.02661058120429516, + 0.02711782604455948, + 0.02755335532128811, + 0.0279958788305521, + 0.029188144952058792, + 0.030728979036211967, + 0.03235115483403206, + 0.03274475783109665, + 0.032767605036497116, + 0.032790470868349075, + 0.03370025381445885, + 0.03485492989420891, + 0.03604917228221893, + 0.03626071289181709, + 0.036258261650800705, + 0.036255817860364914, + 0.03699769452214241, + 0.03791886195540428, + 0.038862962275743484, + 0.04044090583920479, + 0.04223657771945, + 0.04411197826266289, + 0.04464378207921982, + 0.04476458579301834, + 0.04488572105765343, + 0.04554688557982445, + 0.04643185809254646, + 0.04733402281999588, + 0.04769353196024895, + 0.04775702580809593, + 0.04782060533761978, + 0.04889892041683197, + 0.050812698900699615, + 0.05280137434601784, + 0.053860004991292953, + 0.053767863661050797, + 0.053675878793001175, + 0.053697142750024796, + 0.05393741652369499, + 0.054178766906261444, + 0.054437056183815, + 0.054759278893470764, + 0.05508340895175934, + 0.05539876967668533, + 0.05549602955579758, + 0.05559346079826355, + 0.05569106340408325, + 0.056146930903196335, + 0.05665949732065201, + 0.05717674642801285, + 0.05840156599879265, + 0.05999265983700752, + 0.0616271011531353, + 0.06097111105918884, + 0.05782439559698105, + 0.054840076714754105, + 0.05232957750558853, + 0.050899405032396317, + 0.04950832575559616, + 0.04815526306629181, + 0.04790518432855606, + 0.047660425305366516, + 0.047416917979717255, + 0.046028170734643936, + 0.044278912246227264, + 0.04259612783789635, + 0.0411127544939518, + 0.03984219580888748, + 0.03861090540885925, + 0.037581246346235275, + 0.03751401975750923, + 0.03744691237807274, + 0.037379924207925797, + 0.03612405061721802, + 0.034675125032663345, + 0.03328431770205498, + 0.00973655004054308, + 0.010003519244492054, + 0.010758909396827221, + 0.011632165871560574, + 0.012390321120619774, + 0.012256884947419167, + 0.012124885804951191, + 0.012112695723772049, + 0.012263898737728596, + 0.012416988611221313, + 0.012767338193953037, + 0.013231158256530762, + 0.013711828738451004, + 0.014165298081934452, + 0.014627860859036446, + 0.015087679028511047, + 0.015387245453894138, + 0.015692761167883873, + 0.016062114387750626, + 0.016587652266025543, + 0.017130384221673012, + 0.017604507505893707, + 0.017989877611398697, + 0.018383683636784554, + 0.018912332132458687, + 0.019534453749656677, + 0.020177040249109268, + 0.020954515784978867, + 0.021797338500618935, + 0.022674059495329857, + 0.02315363846719265, + 0.023594236001372337, + 0.024044442921876907, + 0.024610495194792747, + 0.025189874693751335, + 0.025780614465475082, + 0.02636592648923397, + 0.026964526623487473, + 0.027627211064100266, + 0.028530938550829887, + 0.029464226216077805, + 0.030435189604759216, + 0.03146014362573624, + 0.03251960873603821, + 0.03352683410048485, + 0.03435303270816803, + 0.0351995974779129, + 0.036076679825782776, + 0.03699583187699318, + 0.03793841227889061, + 0.038860127329826355, + 0.03971603885293007, + 0.0405908077955246, + 0.04144136235117912, + 0.04222331568598747, + 0.04302002117037773, + 0.04387728124856949, + 0.044850997626781464, + 0.045846328139305115, + 0.046687182039022446, + 0.047087714076042175, + 0.04749167710542679, + 0.048076726496219635, + 0.04928548261523247, + 0.05052462965250015, + 0.05171485245227814, + 0.052490778267383575, + 0.05327834188938141, + 0.054054081439971924, + 0.05450711399316788, + 0.05496394634246826, + 0.05542460456490517, + 0.05448783561587334, + 0.05351099371910095, + 0.052551668137311935, + 0.052993081510066986, + 0.05371485650539398, + 0.05444645881652832, + 0.0546102374792099, + 0.05452244356274605, + 0.05443479120731354, + 0.054467301815748215, + 0.054603926837444305, + 0.054740894585847855, + 0.05471903085708618, + 0.0544145330786705, + 0.054111722856760025, + 0.05370344594120979, + 0.05276104062795639, + 0.05183517187833786, + 0.05092555284500122, + 0.050306789577007294, + 0.04970941320061684, + 0.04911913350224495, + 0.04839816316962242, + 0.04763525724411011, + 0.04688437655568123, + 0.04563956335186958, + 0.043882086873054504, + 0.04219228774309158, + 0.040782343596220016, + 0.04024071618914604, + 0.0397062785923481, + 0.039178941398859024, + 0.03880395367741585, + 0.038445450365543365, + 0.03809025511145592, + 0.037092287093400955, + 0.035729747265577316, + 0.03441726416349411, + 0.032991137355566025, + 0.031248273327946663, + 0.029597477987408638, + 0.009476840496063232, + 0.009968876838684082, + 0.010301153175532818, + 0.010468121618032455, + 0.010637796483933926, + 0.01085012685507536, + 0.011077901348471642, + 0.01133041549474001, + 0.012125644832849503, + 0.012976686470210552, + 0.01372605375945568, + 0.014077848754823208, + 0.014438662678003311, + 0.014679999090731144, + 0.014793949201703072, + 0.014908784069120884, + 0.015236596576869488, + 0.01566411927342415, + 0.01610364019870758, + 0.016998499631881714, + 0.017999697476625443, + 0.018996816128492355, + 0.019159257411956787, + 0.019323084503412247, + 0.01971670612692833, + 0.020934101194143295, + 0.022226665169000626, + 0.023157648742198944, + 0.023362262174487114, + 0.023568684235215187, + 0.023972269147634506, + 0.024586370214819908, + 0.025216203182935715, + 0.02597840502858162, + 0.026841705664992332, + 0.02773369662463665, + 0.02842666767537594, + 0.02903723157942295, + 0.0296609066426754, + 0.0305157620459795, + 0.03145948052406311, + 0.03243238851428032, + 0.03364912420511246, + 0.03495415672659874, + 0.03630979731678963, + 0.03650679439306259, + 0.03654782846570015, + 0.03658890724182129, + 0.03808838129043579, + 0.039799291640520096, + 0.04158705100417137, + 0.04289853572845459, + 0.044203851372003555, + 0.04554888606071472, + 0.045812807977199554, + 0.04597800597548485, + 0.0461437962949276, + 0.046600211411714554, + 0.04709567502140999, + 0.04759640619158745, + 0.04856172204017639, + 0.049626365303993225, + 0.05071435496211052, + 0.051932089030742645, + 0.05320645868778229, + 0.05451209843158722, + 0.0565934032201767, + 0.05905035138130188, + 0.061613958328962326, + 0.06125783547759056, + 0.059223778545856476, + 0.057257261127233505, + 0.05673634633421898, + 0.05748957395553589, + 0.058252811431884766, + 0.05783277377486229, + 0.055670689791440964, + 0.053589437156915665, + 0.05222076177597046, + 0.052744582295417786, + 0.053273655474185944, + 0.053875140845775604, + 0.05515163764357567, + 0.056458380073308945, + 0.057796087116003036, + 0.05422962084412575, + 0.050464317202568054, + 0.04696044698357582, + 0.04581064730882645, + 0.04553310573101044, + 0.04525723680853844, + 0.0452352836728096, + 0.04546631500124931, + 0.04569852352142334, + 0.04566383361816406, + 0.04490191861987114, + 0.044152721762657166, + 0.043390657752752304, + 0.041069481521844864, + 0.038872476667165756, + 0.036793000996112823, + 0.03526787459850311, + 0.03395238518714905, + 0.03268596529960632, + 0.03178221359848976, + 0.031272243708372116, + 0.03077046386897564, + 0.030221566557884216, + 0.029376687481999397, + 0.028555426746606827, + 0.027757126837968826, + 0.026400847360491753, + 0.024994514882564545, + 0.009057830087840557, + 0.009372745640575886, + 0.009685065597295761, + 0.009949540719389915, + 0.010221238248050213, + 0.010575905442237854, + 0.011035498231649399, + 0.011515063233673573, + 0.012005157768726349, + 0.012511739507317543, + 0.013039697892963886, + 0.013469810597598553, + 0.013907109387218952, + 0.014355305582284927, + 0.01480089034885168, + 0.015260305255651474, + 0.01586071029305458, + 0.016710784286260605, + 0.01760641671717167, + 0.01818668097257614, + 0.01849547028541565, + 0.018809502944350243, + 0.019369127228856087, + 0.020036764442920685, + 0.02072741650044918, + 0.021216070279479027, + 0.021687490865588188, + 0.02218867838382721, + 0.023359626531600952, + 0.024592366069555283, + 0.025793103501200676, + 0.026500849053263664, + 0.027228016406297684, + 0.02811311185359955, + 0.02943081222474575, + 0.030810274183750153, + 0.032376181334257126, + 0.0342557430267334, + 0.03624441847205162, + 0.03737053647637367, + 0.037236735224723816, + 0.03710341453552246, + 0.037428855895996094, + 0.03824498876929283, + 0.03907891735434532, + 0.039962705224752426, + 0.040894944220781326, + 0.04184892773628235, + 0.042974118143320084, + 0.04425091668963432, + 0.0455656535923481, + 0.04683617502450943, + 0.048077020794153214, + 0.04935074225068092, + 0.05042470991611481, + 0.05133534222841263, + 0.05226241424679756, + 0.0532701350748539, + 0.054353877902030945, + 0.05545967444777489, + 0.056520964950323105, + 0.05753264203667641, + 0.058562420308589935, + 0.05874183401465416, + 0.057808686047792435, + 0.05689035728573799, + 0.05657454580068588, + 0.05731992423534393, + 0.05807512253522873, + 0.058434195816516876, + 0.05768021196126938, + 0.05693595111370087, + 0.056354667991399765, + 0.056615665555000305, + 0.056877873837947845, + 0.057095617055892944, + 0.055649418383836746, + 0.054239846765995026, + 0.05286598205566406, + 0.052649445831775665, + 0.052587464451789856, + 0.052525557577610016, + 0.052347514778375626, + 0.052124377340078354, + 0.05190218612551689, + 0.0504121370613575, + 0.047919098287820816, + 0.04554935172200203, + 0.043611641973257065, + 0.04235934093594551, + 0.04114300012588501, + 0.039947446435689926, + 0.038684312254190445, + 0.03746112063527107, + 0.03627660125494003, + 0.03563840687274933, + 0.035078562796115875, + 0.03452751412987709, + 0.03393761068582535, + 0.033330220729112625, + 0.03273370489478111, + 0.03185145929455757, + 0.03047875687479973, + 0.02916521020233631, + 0.0279233418405056, + 0.02694045379757881, + 0.02599216438829899, + 0.025077251717448235, + 0.023962905630469322, + 0.022827250882983208, + 0.02174541726708412, + 0.02100839838385582, + 0.020680876448750496, + 0.008595580235123634, + 0.008760460652410984, + 0.008928503841161728, + 0.009396528825163841, + 0.009913614951074123, + 0.010403664782643318, + 0.01067828293889761, + 0.010960151441395283, + 0.011376027017831802, + 0.011974994093179703, + 0.012605498544871807, + 0.013139530085027218, + 0.01363217830657959, + 0.01414329744875431, + 0.01460619643330574, + 0.015076148323714733, + 0.015562687069177628, + 0.01607881672680378, + 0.016612062230706215, + 0.017168300226330757, + 0.017756910994648933, + 0.018365701660513878, + 0.01921212300658226, + 0.020370833575725555, + 0.021599428728222847, + 0.022548267617821693, + 0.02330733649432659, + 0.02409195713698864, + 0.024779213592410088, + 0.025444000959396362, + 0.026126623153686523, + 0.027386171743273735, + 0.028791792690753937, + 0.0302695594727993, + 0.031397223472595215, + 0.032558344304561615, + 0.03379103168845177, + 0.03545897826552391, + 0.03720925375819206, + 0.03882099688053131, + 0.039151936769485474, + 0.03948570415377617, + 0.040201518684625626, + 0.04247986152768135, + 0.044887326657772064, + 0.04703351855278015, + 0.04801526665687561, + 0.04901750758290291, + 0.04999897629022598, + 0.05088450387120247, + 0.05178571492433548, + 0.05281710997223854, + 0.054175496101379395, + 0.055568814277648926, + 0.05686492472887039, + 0.05781903117895126, + 0.058789145201444626, + 0.05970410630106926, + 0.06040505692362785, + 0.06111424043774605, + 0.06187499314546585, + 0.06282352656126022, + 0.06378661096096039, + 0.06448143720626831, + 0.06340981274843216, + 0.06235600635409355, + 0.06141429767012596, + 0.06198440119624138, + 0.06255978345870972, + 0.06314051896333694, + 0.06227470189332962, + 0.061368245631456375, + 0.060474980622529984, + 0.059816841036081314, + 0.05920419842004776, + 0.058597829192876816, + 0.05753784626722336, + 0.056323837488889694, + 0.055135440081357956, + 0.0530865453183651, + 0.05048993229866028, + 0.04802032560110092, + 0.04589155316352844, + 0.044163383543491364, + 0.042500294744968414, + 0.04090772569179535, + 0.039400968700647354, + 0.037949707359075546, + 0.03656380996108055, + 0.03569786623120308, + 0.03485242649912834, + 0.034027013927698135, + 0.03272388502955437, + 0.03135566785931587, + 0.030044658109545708, + 0.028993401676416397, + 0.028130751103162766, + 0.027293764054775238, + 0.026497548446059227, + 0.02575862780213356, + 0.025040313601493835, + 0.024340879172086716, + 0.02363237552344799, + 0.0229444932192564, + 0.022276634350419044, + 0.021439846605062485, + 0.02057282067835331, + 0.019740859046578407, + 0.019092988222837448, + 0.018657859414815903, + 0.018232647329568863, + 0.01778288371860981, + 0.01705998182296753, + 0.00815985444933176, + 0.008469625376164913, + 0.008791155181825161, + 0.009077667258679867, + 0.00935481395572424, + 0.009640422649681568, + 0.009965973906219006, + 0.010302981361746788, + 0.010670371353626251, + 0.011115348897874355, + 0.011578882113099098, + 0.012044228613376617, + 0.012507535517215729, + 0.012988665141165257, + 0.013625863939523697, + 0.014361310750246048, + 0.015136451460421085, + 0.015806566923856735, + 0.01648675836622715, + 0.017168747261166573, + 0.01751452498137951, + 0.01786726899445057, + 0.018354110419750214, + 0.01926872320473194, + 0.0202289130538702, + 0.021197687834501266, + 0.022150259464979172, + 0.023145636543631554, + 0.024246446788311005, + 0.025455232709646225, + 0.026724282652139664, + 0.027944738045334816, + 0.029159750789403915, + 0.030427590012550354, + 0.03189767897129059, + 0.03348725661635399, + 0.03515604883432388, + 0.036327607929706573, + 0.037433985620737076, + 0.038574058562517166, + 0.03980398178100586, + 0.04107782244682312, + 0.04239243268966675, + 0.044887084513902664, + 0.04755336791276932, + 0.05032940208911896, + 0.05079253762960434, + 0.051259931176900864, + 0.05178368091583252, + 0.05349837988615036, + 0.05526985600590706, + 0.057047098875045776, + 0.05783812701702118, + 0.05864012986421585, + 0.05948296934366226, + 0.061091210693120956, + 0.0627429336309433, + 0.06443675607442856, + 0.0659441202878952, + 0.06748674809932709, + 0.06906545907258987, + 0.06926057487726212, + 0.06940755993127823, + 0.06955485045909882, + 0.06858178228139877, + 0.06750719994306564, + 0.06644945591688156, + 0.06585636734962463, + 0.0653625950217247, + 0.06487251818180084, + 0.0650358647108078, + 0.06544283777475357, + 0.06585235148668289, + 0.06393294036388397, + 0.060696955770254135, + 0.05762476101517677, + 0.055182166397571564, + 0.053330957889556885, + 0.051541849970817566, + 0.049370843917131424, + 0.046462953090667725, + 0.04372633621096611, + 0.04168913513422012, + 0.04237990081310272, + 0.043082110583782196, + 0.043795958161354065, + 0.03995098918676376, + 0.03637868911027908, + 0.03312581405043602, + 0.0317000150680542, + 0.030760517343878746, + 0.029848864302039146, + 0.02849734202027321, + 0.026862574741244316, + 0.025321586057543755, + 0.024148685857653618, + 0.02360275387763977, + 0.023069161921739578, + 0.02255515567958355, + 0.022159241139888763, + 0.021770276129245758, + 0.021388141438364983, + 0.020535238087177277, + 0.019595708698034286, + 0.0186991635710001, + 0.018006961792707443, + 0.017502088099718094, + 0.01701137237250805, + 0.01650160178542137, + 0.015865713357925415, + 0.015254330821335316, + 0.01466650515794754, + 0.014123113825917244, + 0.007216180674731731, + 0.00731148524209857, + 0.007408048491925001, + 0.007641876116394997, + 0.007988582365214825, + 0.008351017720997334, + 0.008647145703434944, + 0.008937254548072815, + 0.009257687255740166, + 0.009821640327572823, + 0.010419948026537895, + 0.010945742949843407, + 0.011255583725869656, + 0.011574194766581059, + 0.011849784292280674, + 0.012085581198334694, + 0.012326071038842201, + 0.012959830462932587, + 0.013776910491287708, + 0.01464550569653511, + 0.015188949182629585, + 0.015718521550297737, + 0.016296863555908203, + 0.017223134636878967, + 0.018202051520347595, + 0.019272837787866592, + 0.02052740380167961, + 0.021863635629415512, + 0.022944729775190353, + 0.023502064868807793, + 0.024072937667369843, + 0.02541687712073326, + 0.02766254171729088, + 0.030106617137789726, + 0.03189753368496895, + 0.03320597857236862, + 0.034568097442388535, + 0.03632420673966408, + 0.03832799941301346, + 0.0404423326253891, + 0.04179518297314644, + 0.04291825741529465, + 0.0440715067088604, + 0.045727018266916275, + 0.04755236580967903, + 0.04945058375597, + 0.05106653645634651, + 0.05267506465315819, + 0.054334256798028946, + 0.05678688734769821, + 0.05945506691932678, + 0.06224860996007919, + 0.06470516324043274, + 0.06719689816236496, + 0.06978459656238556, + 0.07158708572387695, + 0.07330798357725143, + 0.07507025450468063, + 0.07722459733486176, + 0.07950589060783386, + 0.08185456693172455, + 0.08136658370494843, + 0.08018191158771515, + 0.07901448756456375, + 0.07681827247142792, + 0.07432709634304047, + 0.07191670686006546, + 0.07078363746404648, + 0.07028719782829285, + 0.06979425251483917, + 0.06795515865087509, + 0.0651567354798317, + 0.062473539263010025, + 0.06023124232888222, + 0.05846615880727768, + 0.05675279721617699, + 0.05456564947962761, + 0.051381297409534454, + 0.04838277027010918, + 0.045910175889730453, + 0.0452948734164238, + 0.04468781501054764, + 0.04408889263868332, + 0.040056463330984116, + 0.03638320416212082, + 0.03304678946733475, + 0.03120131604373455, + 0.029725607484579086, + 0.028319695964455605, + 0.027587782591581345, + 0.027264006435871124, + 0.026944030076265335, + 0.025920825079083443, + 0.023891381919384003, + 0.02202083356678486, + 0.02044704370200634, + 0.019822020083665848, + 0.019216101616621017, + 0.01862870343029499, + 0.018057748675346375, + 0.01750410534441471, + 0.01696743816137314, + 0.0164690800011158, + 0.0159988421946764, + 0.015542030334472656, + 0.015202910639345646, + 0.015094367787241936, + 0.014986601658165455, + 0.014877702109515667, + 0.01421948242932558, + 0.013590383343398571, + 0.012989116832613945, + 0.012582940980792046, + 0.004839679691940546, + 0.004974644165486097, + 0.005113373044878244, + 0.005298257805407047, + 0.005536545999348164, + 0.005785551853477955, + 0.00606571463868022, + 0.0063664885237813, + 0.006682176608592272, + 0.00691881962120533, + 0.0071634165942668915, + 0.007414621766656637, + 0.007667460944503546, + 0.007928921841084957, + 0.008223849348723888, + 0.008561852388083935, + 0.008913747034966946, + 0.009334529750049114, + 0.009806904941797256, + 0.010303185321390629, + 0.010765962302684784, + 0.011236834339797497, + 0.011728300713002682, + 0.012612268328666687, + 0.01356429047882557, + 0.01454541739076376, + 0.015338443219661713, + 0.01617470569908619, + 0.017147360369563103, + 0.018421385437250137, + 0.01979007013142109, + 0.02090381272137165, + 0.021540874615311623, + 0.022197352722287178, + 0.023453306406736374, + 0.025382280349731445, + 0.02746991254389286, + 0.029036687687039375, + 0.03021080233156681, + 0.031432390213012695, + 0.03316827490925789, + 0.03524453938007355, + 0.03745076432824135, + 0.03972278907895088, + 0.042103540152311325, + 0.04462698474526405, + 0.04663722589612007, + 0.04852442070841789, + 0.05048798397183418, + 0.05558142811059952, + 0.06214386224746704, + 0.06948111206293106, + 0.07242301851511002, + 0.07409147173166275, + 0.07579837739467621, + 0.08052296936511993, + 0.08646947145462036, + 0.09285511821508408, + 0.09570610523223877, + 0.09729508310556412, + 0.09891043603420258, + 0.09884974360466003, + 0.09807700663805008, + 0.09731031209230423, + 0.09644589573144913, + 0.09553118050098419, + 0.09462515264749527, + 0.09147031605243683, + 0.08673457056283951, + 0.08224400877952576, + 0.07908158004283905, + 0.07729201763868332, + 0.07554294914007187, + 0.07245183736085892, + 0.06704474985599518, + 0.06204118952155113, + 0.057671163231134415, + 0.05451411381363869, + 0.051529888063669205, + 0.04859767481684685, + 0.04427340626716614, + 0.04033391922712326, + 0.036744970828294754, + 0.03452723100781441, + 0.03256293386220932, + 0.030710382387042046, + 0.02884632721543312, + 0.02705015242099762, + 0.02536582015454769, + 0.02387809567153454, + 0.0225631445646286, + 0.021320601925253868, + 0.020100928843021393, + 0.018841631710529327, + 0.01766122877597809, + 0.016570869833230972, + 0.01590779423713684, + 0.015271252021193504, + 0.014660178683698177, + 0.01410084217786789, + 0.013570167124271393, + 0.013059462420642376, + 0.012579354457557201, + 0.012127644382417202, + 0.01169215515255928, + 0.01128358393907547, + 0.010930441319942474, + 0.010588351637125015, + 0.01025696936994791, + 0.009874499402940273, + 0.009499413892626762, + 0.009138574823737144, + 0.008749973960220814, + 0.00554677052423358, + 0.005757700186222792, + 0.005976651329547167, + 0.006233539432287216, + 0.0065384311601519585, + 0.006858235225081444, + 0.007163385394960642, + 0.007469772361218929, + 0.007789264433085918, + 0.00803038477897644, + 0.008275626227259636, + 0.008534231223165989, + 0.008825625292956829, + 0.009126969613134861, + 0.009448780678212643, + 0.009796937927603722, + 0.010157923214137554, + 0.010610836558043957, + 0.011136101558804512, + 0.011687369085848331, + 0.012248402461409569, + 0.012831704691052437, + 0.01344278547912836, + 0.014084877446293831, + 0.014757710509002209, + 0.01553517859429121, + 0.016934173181653023, + 0.018459152430295944, + 0.01974155753850937, + 0.01996746100485325, + 0.02019594982266426, + 0.02090040221810341, + 0.022471392527222633, + 0.024160467088222504, + 0.025669557973742485, + 0.026922499760985374, + 0.028236601501703262, + 0.029538236558437347, + 0.030838724225759506, + 0.03219647333025932, + 0.03365693241357803, + 0.03520914539694786, + 0.036832939833402634, + 0.038380347192287445, + 0.0399230420589447, + 0.04152774438261986, + 0.04439983516931534, + 0.047952912747859955, + 0.051790330559015274, + 0.05389923229813576, + 0.05541374161839485, + 0.05697080120444298, + 0.06014455854892731, + 0.06403736770153046, + 0.06818213313817978, + 0.07193230092525482, + 0.075650654733181, + 0.07956123352050781, + 0.0822552740573883, + 0.08446480333805084, + 0.08673369139432907, + 0.08712606132030487, + 0.08657480031251907, + 0.08602703362703323, + 0.0856388583779335, + 0.08535364270210266, + 0.08506938070058823, + 0.08441917598247528, + 0.08344632387161255, + 0.08248467743396759, + 0.0806475579738617, + 0.07770410925149918, + 0.0748680904507637, + 0.07203596085309982, + 0.0690997838973999, + 0.06628328561782837, + 0.0632031261920929, + 0.05863389000296593, + 0.05439498648047447, + 0.05049726366996765, + 0.04801800101995468, + 0.04566045477986336, + 0.043418657034635544, + 0.04045223817229271, + 0.03756270930171013, + 0.03487958386540413, + 0.03326667100191116, + 0.0321437306702137, + 0.031058695167303085, + 0.029568351805210114, + 0.027679944410920143, + 0.025912143290042877, + 0.02442045323550701, + 0.023492129519581795, + 0.022599097341299057, + 0.02173796482384205, + 0.020561423152685165, + 0.019448556005954742, + 0.0183959249407053, + 0.017768045887351036, + 0.017283771187067032, + 0.016812697052955627, + 0.01629171334207058, + 0.01571846194565296, + 0.01516538206487894, + 0.014622297137975693, + 0.014055363833904266, + 0.01351041067391634, + 0.01298658736050129, + 0.012509523890912533, + 0.012054151855409145, + 0.011615357361733913, + 0.01115600485354662, + 0.0071641611866652966, + 0.007353057619184256, + 0.007546934764832258, + 0.007831474766135216, + 0.00822169054299593, + 0.00863135140389204, + 0.009030068293213844, + 0.009436209686100483, + 0.009860617108643055, + 0.009806673042476177, + 0.009750910103321075, + 0.009829827584326267, + 0.010384299792349339, + 0.010970047675073147, + 0.011508077383041382, + 0.011966874822974205, + 0.01244396436959505, + 0.012854592874646187, + 0.01323008444160223, + 0.01361654419451952, + 0.014156843535602093, + 0.014749579131603241, + 0.015367131680250168, + 0.01613994501531124, + 0.01695210300385952, + 0.017814891412854195, + 0.018780222162604332, + 0.019797861576080322, + 0.02075769007205963, + 0.02147079072892666, + 0.022208387032151222, + 0.02339923568069935, + 0.025328204035758972, + 0.02741619013249874, + 0.029085567221045494, + 0.03026707097887993, + 0.0314965695142746, + 0.03245725855231285, + 0.03322844207286835, + 0.03401795029640198, + 0.03520538657903671, + 0.03662937507033348, + 0.03811095654964447, + 0.039764851331710815, + 0.0415351502597332, + 0.04338426515460014, + 0.045099299401044846, + 0.046812497079372406, + 0.04859078302979469, + 0.05094548687338829, + 0.05356164276599884, + 0.05631214380264282, + 0.057921383529901505, + 0.05922986939549446, + 0.060567911714315414, + 0.06326811015605927, + 0.06649225205183029, + 0.06988068670034409, + 0.07093781232833862, + 0.07117664813995361, + 0.07141629606485367, + 0.07340649515390396, + 0.0762271136045456, + 0.07915610820055008, + 0.07936108857393265, + 0.07800518721342087, + 0.07667244970798492, + 0.07496935874223709, + 0.07300195097923279, + 0.07108617573976517, + 0.06939435750246048, + 0.06794168055057526, + 0.06651942431926727, + 0.06506476551294327, + 0.06352689862251282, + 0.06202537193894386, + 0.06016063690185547, + 0.0569416768848896, + 0.053894951939582825, + 0.05103767663240433, + 0.04871193692088127, + 0.04649217426776886, + 0.04437357187271118, + 0.04256833717226982, + 0.040861357003450394, + 0.03922282159328461, + 0.037891484797000885, + 0.03670221567153931, + 0.03555027395486832, + 0.033762089908123016, + 0.03144608438014984, + 0.02928895317018032, + 0.02769351564347744, + 0.027212515473365784, + 0.026739871129393578, + 0.026258565485477448, + 0.025398829951882362, + 0.024567242711782455, + 0.023762881755828857, + 0.023365765810012817, + 0.023080740123987198, + 0.022799190133810043, + 0.02203037403523922, + 0.02083289809525013, + 0.019700512290000916, + 0.018817629665136337, + 0.018667807802557945, + 0.01851917803287506, + 0.018371732905507088, + 0.017492061480879784, + 0.016574908047914505, + 0.01570584438741207, + 0.01510629802942276, + 0.010127401910722256, + 0.010595528408885002, + 0.01108529418706894, + 0.011308238841593266, + 0.011321802623569965, + 0.011335385963320732, + 0.011764719150960445, + 0.01229578722268343, + 0.0128486854955554, + 0.013402430340647697, + 0.01398004125803709, + 0.014460491947829723, + 0.014689361676573753, + 0.014921851456165314, + 0.015481522306799889, + 0.016361258924007416, + 0.017290985211730003, + 0.01799197494983673, + 0.01861659064888954, + 0.0192628912627697, + 0.019725115969777107, + 0.020180020481348038, + 0.02065679244697094, + 0.021264975890517235, + 0.021891064941883087, + 0.022555839270353317, + 0.023306366056203842, + 0.024081865325570107, + 0.025196516886353493, + 0.02690918743610382, + 0.028738275170326233, + 0.0296611525118351, + 0.029585231095552444, + 0.02950950339436531, + 0.030269239097833633, + 0.0316220186650753, + 0.03303525969386101, + 0.033984988927841187, + 0.03472462669014931, + 0.03548036515712738, + 0.03755703940987587, + 0.040189389139413834, + 0.04300623759627342, + 0.043836306780576706, + 0.04420960694551468, + 0.04458608105778694, + 0.045505449175834656, + 0.046534497290849686, + 0.04758681356906891, + 0.04821106418967247, + 0.04878233000636101, + 0.04936036095023155, + 0.050081510096788406, + 0.05083083361387253, + 0.05159137025475502, + 0.052629467099905014, + 0.0537271648645401, + 0.05484775826334953, + 0.05591772869229317, + 0.0569949597120285, + 0.05809294804930687, + 0.05820178985595703, + 0.05806294083595276, + 0.05792441964149475, + 0.05796068161725998, + 0.05805876851081848, + 0.05815702676773071, + 0.057920902967453, + 0.057514045387506485, + 0.057110052555799484, + 0.05661908537149429, + 0.05606294795870781, + 0.05551227927207947, + 0.05492729693651199, + 0.05429985746741295, + 0.05367959290742874, + 0.05288949981331825, + 0.05173315480351448, + 0.05060208588838577, + 0.04943384602665901, + 0.047986678779125214, + 0.046581871807575226, + 0.04521819204092026, + 0.04405614361166954, + 0.04292446747422218, + 0.041821856051683426, + 0.04092142730951309, + 0.04008008539676666, + 0.03925604000687599, + 0.03844070062041283, + 0.03763708844780922, + 0.036850281059741974, + 0.03613416478037834, + 0.03551676124334335, + 0.03490990772843361, + 0.03426855430006981, + 0.03338278830051422, + 0.03251992538571358, + 0.03167935833334923, + 0.030996544286608696, + 0.030345257371664047, + 0.0297076553106308, + 0.02889936976134777, + 0.027999985963106155, + 0.027128595858812332, + 0.02646300382912159, + 0.026193669065833092, + 0.025927076116204262, + 0.025661183521151543, + 0.024813039228320122, + 0.02399292401969433, + 0.023199917748570442, + 0.02255871519446373, + 0.011263813823461533, + 0.011538980528712273, + 0.011820869520306587, + 0.012455949559807777, + 0.0132683664560318, + 0.014133771881461143, + 0.014515362679958344, + 0.014899474568665028, + 0.015307292342185974, + 0.015771804377436638, + 0.01625041291117668, + 0.01658339984714985, + 0.01673879474401474, + 0.01689564436674118, + 0.017510363832116127, + 0.018369637429714203, + 0.01927107572555542, + 0.01965528540313244, + 0.01997477188706398, + 0.020321255549788475, + 0.02096160128712654, + 0.021622123196721077, + 0.022294197231531143, + 0.022957278415560722, + 0.02364007942378521, + 0.024533212184906006, + 0.02576380781829357, + 0.027056129649281502, + 0.02812436781823635, + 0.02897523157298565, + 0.02985183335840702, + 0.030390623956918716, + 0.030746309086680412, + 0.03110615536570549, + 0.0317532941699028, + 0.03250494599342346, + 0.033274389803409576, + 0.03466276824474335, + 0.03621998056769371, + 0.03784715011715889, + 0.03841863200068474, + 0.03890550509095192, + 0.03939855471253395, + 0.04026946797966957, + 0.04116739705204964, + 0.042071904987096786, + 0.042324744164943695, + 0.042579103261232376, + 0.04284118488430977, + 0.043244022876024246, + 0.04365064948797226, + 0.04404561594128609, + 0.04414389282464981, + 0.044242389500141144, + 0.04436614364385605, + 0.045118026435375214, + 0.045882657170295715, + 0.04666029289364815, + 0.04745534807443619, + 0.048263952136039734, + 0.04908633232116699, + 0.048544928431510925, + 0.04796309769153595, + 0.047388240694999695, + 0.047351788729429245, + 0.04737154766917229, + 0.047391317784786224, + 0.046982090920209885, + 0.0464872270822525, + 0.04599757120013237, + 0.04609520360827446, + 0.04641126096248627, + 0.04672948271036148, + 0.0473083034157753, + 0.048058342188596725, + 0.048820268362760544, + 0.048943884670734406, + 0.04838278144598007, + 0.04782811179757118, + 0.04720596596598625, + 0.046447742730379105, + 0.04570169374346733, + 0.04511825740337372, + 0.045283615589141846, + 0.04544958099722862, + 0.04561615362763405, + 0.04483809694647789, + 0.044058188796043396, + 0.0432918407022953, + 0.04248625040054321, + 0.041681211441755295, + 0.04089142382144928, + 0.04052390903234482, + 0.040479015558958054, + 0.04043417423963547, + 0.040487561374902725, + 0.04074908047914505, + 0.04101228713989258, + 0.041179314255714417, + 0.039951302111148834, + 0.03875991329550743, + 0.03760405257344246, + 0.03701851889491081, + 0.036584269255399704, + 0.03615511208772659, + 0.03601200506091118, + 0.036156877875328064, + 0.03630232810974121, + 0.03608042001724243, + 0.03427085280418396, + 0.032552044838666916, + 0.03091944009065628, + 0.030612623319029808, + 0.009463836438953876, + 0.009858044795691967, + 0.010268674232065678, + 0.010746425949037075, + 0.011250456795096397, + 0.01175996009260416, + 0.012213627807796001, + 0.012684796005487442, + 0.013065138831734657, + 0.013317014090716839, + 0.013573744334280491, + 0.013912788592278957, + 0.01429828442633152, + 0.014694462530314922, + 0.015227538533508778, + 0.01579524576663971, + 0.01636197790503502, + 0.01674017310142517, + 0.017127107828855515, + 0.017623981460928917, + 0.018398134037852287, + 0.019206291064620018, + 0.01984470523893833, + 0.02025473117828369, + 0.020673232153058052, + 0.021672556176781654, + 0.02310924418270588, + 0.02464117296040058, + 0.0250945333391428, + 0.025169776752591133, + 0.025245247408747673, + 0.025926688686013222, + 0.02671736292541027, + 0.027532149106264114, + 0.028043879196047783, + 0.028558650985360146, + 0.029138095676898956, + 0.03047160990536213, + 0.031866155564785004, + 0.033192768692970276, + 0.033779844641685486, + 0.03437729924917221, + 0.03495929390192032, + 0.035447534173727036, + 0.035942595452070236, + 0.03640102967619896, + 0.03672921285033226, + 0.03706036135554314, + 0.037474725395441055, + 0.038115497678518295, + 0.03876722604036331, + 0.03918773680925369, + 0.03897799924015999, + 0.03876938298344612, + 0.03885163366794586, + 0.03974270075559616, + 0.040654201060533524, + 0.04121466353535652, + 0.04061540961265564, + 0.04002486914396286, + 0.03963935375213623, + 0.04005849361419678, + 0.04048207402229309, + 0.0408833809196949, + 0.04111890867352486, + 0.04135579243302345, + 0.04157564043998718, + 0.041504234075546265, + 0.0414329469203949, + 0.04136178642511368, + 0.04211881011724472, + 0.04292130470275879, + 0.043739091604948044, + 0.04368247836828232, + 0.0434730127453804, + 0.04326455295085907, + 0.04334832727909088, + 0.04354534298181534, + 0.043743252754211426, + 0.04464427009224892, + 0.04610321670770645, + 0.0476098358631134, + 0.04864806681871414, + 0.04895303025841713, + 0.04925990477204323, + 0.04974875599145889, + 0.050873007625341415, + 0.05202266946434975, + 0.053149666637182236, + 0.0523194782435894, + 0.051502253860235214, + 0.050697796046733856, + 0.050776321440935135, + 0.05106883868575096, + 0.05136305093765259, + 0.05143307149410248, + 0.0513312928378582, + 0.05122971162199974, + 0.05114743858575821, + 0.051107458770275116, + 0.05106750503182411, + 0.051035985350608826, + 0.05121993273496628, + 0.05140454322099686, + 0.05158982425928116, + 0.051175620406866074, + 0.05056263133883476, + 0.04995698481798172, + 0.049045246094465256, + 0.04775194078683853, + 0.04649273678660393, + 0.04527555778622627, + 0.04416405409574509, + 0.007540632039308548, + 0.007958419620990753, + 0.008412319235503674, + 0.008949576877057552, + 0.00952114723622799, + 0.009815387427806854, + 0.009751166217029095, + 0.009687365964055061, + 0.009925016202032566, + 0.010296755470335484, + 0.010682418942451477, + 0.011124003678560257, + 0.011586293578147888, + 0.012050977908074856, + 0.012447004206478596, + 0.012856044806540012, + 0.013232017867267132, + 0.013538104481995106, + 0.013851270079612732, + 0.014335247687995434, + 0.014970909804105759, + 0.01563475839793682, + 0.016133297234773636, + 0.01657475344836712, + 0.017028288915753365, + 0.017520982772111893, + 0.01803138107061386, + 0.018562059849500656, + 0.019292330369353294, + 0.02005133405327797, + 0.020812103524804115, + 0.021442489698529243, + 0.022091971710324287, + 0.022789109498262405, + 0.023589491844177246, + 0.02441798895597458, + 0.024993598461151123, + 0.02506592683494091, + 0.02513846755027771, + 0.025474680587649345, + 0.026172971352934837, + 0.026890404522418976, + 0.02749589830636978, + 0.027975482866168022, + 0.02846343256533146, + 0.02914332039654255, + 0.03000537119805813, + 0.03089292347431183, + 0.0312991626560688, + 0.03130979463458061, + 0.03132043406367302, + 0.031645599752664566, + 0.03221838176250458, + 0.03280153125524521, + 0.03292757645249367, + 0.032689791172742844, + 0.03245372697710991, + 0.032605621963739395, + 0.03309877589344978, + 0.03359939157962799, + 0.03438987955451012, + 0.03549772500991821, + 0.03664126619696617, + 0.037359967827796936, + 0.03748984634876251, + 0.0376201793551445, + 0.03763139620423317, + 0.03742996230721474, + 0.03722960874438286, + 0.03718937560915947, + 0.0375920832157135, + 0.03799915686249733, + 0.03841221705079079, + 0.03883851319551468, + 0.03926953673362732, + 0.0397159680724144, + 0.040565431118011475, + 0.04143306240439415, + 0.042319245636463165, + 0.043695565313100815, + 0.04518311843276024, + 0.046721313148736954, + 0.048512786626815796, + 0.05045563727617264, + 0.052476298063993454, + 0.05361783877015114, + 0.05394628271460533, + 0.054276738315820694, + 0.05489610135555267, + 0.056101176887750626, + 0.057332705706357956, + 0.05862100049853325, + 0.060165613889694214, + 0.061750926077365875, + 0.06337801367044449, + 0.0643816739320755, + 0.06531161069869995, + 0.06625497341156006, + 0.06692086905241013, + 0.06742031872272491, + 0.06792350113391876, + 0.06836195290088654, + 0.06867892295122147, + 0.06899736821651459, + 0.06930632144212723, + 0.06946007162332535, + 0.06961416453123093, + 0.06976859271526337, + 0.06832866370677948, + 0.06642315536737442, + 0.06457078456878662, + 0.06308388710021973, + 0.06204255297780037, + 0.004840236157178879, + 0.004989082925021648, + 0.0052059730514883995, + 0.005495100282132626, + 0.00580028397962451, + 0.006055935751646757, + 0.006303922273218632, + 0.006563578266650438, + 0.006874551996588707, + 0.00720025971531868, + 0.007573689799755812, + 0.008056772872805595, + 0.00857066921889782, + 0.008851946331560612, + 0.008872910402715206, + 0.008893923833966255, + 0.009159961715340614, + 0.009542642161250114, + 0.009941309690475464, + 0.010400692000985146, + 0.010886813513934612, + 0.01139296405017376, + 0.011884111911058426, + 0.0123964324593544, + 0.012893157079815865, + 0.01327693834900856, + 0.013672145083546638, + 0.014120258390903473, + 0.014655891805887222, + 0.015211844816803932, + 0.015771806240081787, + 0.016334399580955505, + 0.016917061060667038, + 0.017597109079360962, + 0.018356431275606155, + 0.01914851926267147, + 0.019704274833202362, + 0.020158199593424797, + 0.020622581243515015, + 0.02102028578519821, + 0.021403208374977112, + 0.021793106570839882, + 0.02212364785373211, + 0.022446295246481895, + 0.022773651406168938, + 0.023079117760062218, + 0.02338513545691967, + 0.023695211857557297, + 0.024273987859487534, + 0.024893276393413544, + 0.02552836202085018, + 0.026107992976903915, + 0.026694683358073235, + 0.02729455940425396, + 0.027397526428103447, + 0.027455231174826622, + 0.027513055130839348, + 0.02799413353204727, + 0.02853463962674141, + 0.029085582122206688, + 0.0292581245303154, + 0.029365960508584976, + 0.02947419509291649, + 0.029855191707611084, + 0.03031112439930439, + 0.03077402152121067, + 0.031088415533304214, + 0.031346481293439865, + 0.03160668909549713, + 0.0323716439306736, + 0.0334569551050663, + 0.03457865118980408, + 0.03537791594862938, + 0.03586491197347641, + 0.03635861352086067, + 0.037049539387226105, + 0.03804871812462807, + 0.0390748493373394, + 0.04043501615524292, + 0.04278591275215149, + 0.045273490250110626, + 0.047775235027074814, + 0.04908832907676697, + 0.05043751001358032, + 0.05182377249002457, + 0.05370308458805084, + 0.055695485323667526, + 0.05776181071996689, + 0.06021023169159889, + 0.06288918107748032, + 0.06568732857704163, + 0.06794372946023941, + 0.06959669291973114, + 0.07128987461328506, + 0.0730421394109726, + 0.07488779723644257, + 0.07678009569644928, + 0.07870367169380188, + 0.07959329336881638, + 0.08049296587705612, + 0.08140281587839127, + 0.0823349803686142, + 0.0832819864153862, + 0.08423987776041031, + 0.08598621189594269, + 0.08872197568416595, + 0.09154476970434189, + 0.09367014467716217, + 0.09139646589756012, + 0.08917797356843948, + 0.08701333403587341, + 0.08368533104658127, + 0.08023705333471298, + 0.004196707159280777, + 0.004380346275866032, + 0.004612179007381201, + 0.004861151333898306, + 0.005122859962284565, + 0.0053949784487485886, + 0.005681551527231932, + 0.005944238044321537, + 0.006163630168884993, + 0.00639112014323473, + 0.006869353353977203, + 0.007519794162362814, + 0.00823182426393032, + 0.008236978203058243, + 0.008147776126861572, + 0.00810398068279028, + 0.0084949666634202, + 0.008904815651476383, + 0.009273366071283817, + 0.009501315653324127, + 0.009734868071973324, + 0.010158289223909378, + 0.010826240293681622, + 0.011538111604750156, + 0.012100378051400185, + 0.01256813108921051, + 0.013053965754806995, + 0.013527327217161655, + 0.014008202590048313, + 0.014506170526146889, + 0.015032506547868252, + 0.015579184517264366, + 0.016145888715982437, + 0.016746139153838158, + 0.017368704080581665, + 0.01802152581512928, + 0.01876000501215458, + 0.019528744742274284, + 0.020158136263489723, + 0.020062267780303955, + 0.01996685564517975, + 0.020013833418488503, + 0.02049061469733715, + 0.02097875438630581, + 0.021444616839289665, + 0.02183954045176506, + 0.022241737693548203, + 0.022631634026765823, + 0.02298745885491371, + 0.02334888093173504, + 0.023807359859347343, + 0.02445492520928383, + 0.025120103731751442, + 0.025744343176484108, + 0.02626650035381317, + 0.026799246668815613, + 0.02724538929760456, + 0.027488498017191887, + 0.027733776718378067, + 0.02795637957751751, + 0.028116906061768532, + 0.028278354555368423, + 0.028556961566209793, + 0.029241111129522324, + 0.029941651970148087, + 0.030625250190496445, + 0.031138041988015175, + 0.03165941685438156, + 0.03227315470576286, + 0.034113261848688126, + 0.03605828806757927, + 0.038114212453365326, + 0.03890075534582138, + 0.03964638710021973, + 0.04040631279349327, + 0.04077835753560066, + 0.04107501730322838, + 0.041373834013938904, + 0.04225844144821167, + 0.04342582821846008, + 0.04462546482682228, + 0.045724403113126755, + 0.0467320941388607, + 0.04776198789477348, + 0.04916362091898918, + 0.051253605633974075, + 0.05343243479728699, + 0.0556415319442749, + 0.057613030076026917, + 0.059654392302036285, + 0.061768077313899994, + 0.06385175883769989, + 0.06600020825862885, + 0.06822094321250916, + 0.07176456600427628, + 0.07600771635770798, + 0.0805017426609993, + 0.08393339067697525, + 0.08598407357931137, + 0.08808485418558121, + 0.09013497084379196, + 0.09182637929916382, + 0.09354952722787857, + 0.09530501812696457, + 0.09534713625907898, + 0.0952346995472908, + 0.09512239694595337, + 0.09276225417852402, + 0.08910661190748215, + 0.0855950340628624, + 0.08236242085695267, + 0.0795833021402359, + 0.07689796388149261, + 0.00593451876193285, + 0.006284547038376331, + 0.006522870156913996, + 0.0067702303640544415, + 0.007039089687168598, + 0.007326739840209484, + 0.007626145146787167, + 0.007976663298904896, + 0.008349591866135597, + 0.008756011724472046, + 0.009322047233581543, + 0.009924674406647682, + 0.010510582476854324, + 0.011014874093234539, + 0.01154336053878069, + 0.011997781693935394, + 0.012384733185172081, + 0.01278416346758604, + 0.01303128432482481, + 0.013224818743765354, + 0.013421227224171162, + 0.013965542428195477, + 0.014563426375389099, + 0.015183081850409508, + 0.015785591676831245, + 0.01641201041638851, + 0.01715756766498089, + 0.018268408253788948, + 0.019451171159744263, + 0.02032390609383583, + 0.02054441161453724, + 0.020767314359545708, + 0.021060146391391754, + 0.021432138979434967, + 0.021810701116919518, + 0.02237069234251976, + 0.023077374324202538, + 0.023806380107998848, + 0.02417696639895439, + 0.024355731904506683, + 0.02453581802546978, + 0.0248299241065979, + 0.02517077699303627, + 0.025516310706734657, + 0.02608337439596653, + 0.02672756463289261, + 0.02738766372203827, + 0.027931474149227142, + 0.0284541267901659, + 0.028986556455492973, + 0.029055168852210045, + 0.02902396395802498, + 0.02899279072880745, + 0.029303129762411118, + 0.029690973460674286, + 0.030083946883678436, + 0.0307582076638937, + 0.031515613198280334, + 0.03229166939854622, + 0.032614417374134064, + 0.032800935208797455, + 0.0329885259270668, + 0.033088237047195435, + 0.033153731375932693, + 0.0332193560898304, + 0.033715177327394485, + 0.03445381671190262, + 0.03520863130688667, + 0.035911329090595245, + 0.03657439351081848, + 0.03724970296025276, + 0.03780335932970047, + 0.038207534700632095, + 0.038616031408309937, + 0.039317235350608826, + 0.040603864938020706, + 0.041932594031095505, + 0.043175578117370605, + 0.043936070054769516, + 0.044709958136081696, + 0.045510198920965195, + 0.046590935438871384, + 0.04769733548164368, + 0.04883000627160072, + 0.04932606965303421, + 0.04972993582487106, + 0.05013711005449295, + 0.05158456787467003, + 0.053582191467285156, + 0.05565716698765755, + 0.05783955752849579, + 0.06013918295502663, + 0.06253023445606232, + 0.06504973024129868, + 0.06777933984994888, + 0.070623479783535, + 0.07358697056770325, + 0.07519745826721191, + 0.07683757692575455, + 0.07851347327232361, + 0.0784621313214302, + 0.07777439057826996, + 0.07709266990423203, + 0.07665827870368958, + 0.07652212679386139, + 0.0763862133026123, + 0.0760345309972763, + 0.07445228844881058, + 0.07290297001600266, + 0.07138589769601822, + 0.06880953907966614, + 0.06610870361328125, + 0.0635138750076294, + 0.01285958755761385, + 0.013189981691539288, + 0.013275377452373505, + 0.013361326418817043, + 0.013811553828418255, + 0.014443845488131046, + 0.015105082653462887, + 0.015250560827553272, + 0.015371769666671753, + 0.015542612411081791, + 0.015917131677269936, + 0.01630067639052868, + 0.016844043508172035, + 0.01761881820857525, + 0.018429232761263847, + 0.018946757540106773, + 0.01928701438009739, + 0.019633380696177483, + 0.019970649853348732, + 0.02031056024134159, + 0.02065269649028778, + 0.020689506083726883, + 0.020726380869746208, + 0.02085404470562935, + 0.021417004987597466, + 0.021995162591338158, + 0.022734832018613815, + 0.023818006739020348, + 0.024952789768576622, + 0.025545448064804077, + 0.025440502911806107, + 0.02533598430454731, + 0.02553306706249714, + 0.025961987674236298, + 0.02639811299741268, + 0.027082594111561775, + 0.027907095849514008, + 0.028756694868206978, + 0.029404878616333008, + 0.029992133378982544, + 0.030591117218136787, + 0.031431980431079865, + 0.032347872853279114, + 0.03329045698046684, + 0.03350916504859924, + 0.033618416637182236, + 0.03372802212834358, + 0.034608665853738785, + 0.03559716418385506, + 0.03661389648914337, + 0.03741859644651413, + 0.03821992501616478, + 0.039038415998220444, + 0.03919069468975067, + 0.039285242557525635, + 0.039380017668008804, + 0.03947848826646805, + 0.03957757353782654, + 0.039676908403635025, + 0.04080916568636894, + 0.04213455319404602, + 0.043502990156412125, + 0.04390253126621246, + 0.04408310726284981, + 0.044264428317546844, + 0.044433899223804474, + 0.044599831104278564, + 0.0447663851082325, + 0.0458664707839489, + 0.04748166725039482, + 0.04915374517440796, + 0.05094664543867111, + 0.052854929119348526, + 0.054834697395563126, + 0.05496613308787346, + 0.05275854468345642, + 0.050639618188142776, + 0.049380768090486526, + 0.04992825537919998, + 0.050481803715229034, + 0.050982795655727386, + 0.05114995688199997, + 0.051317665725946426, + 0.051485925912857056, + 0.05222025886178017, + 0.05297989398241043, + 0.05375057831406593, + 0.053689420223236084, + 0.053398050367832184, + 0.05310825631022453, + 0.05239862948656082, + 0.05139227211475372, + 0.050405241549015045, + 0.04946305230259895, + 0.048586368560791016, + 0.04772522300481796, + 0.04687564820051193, + 0.046008918434381485, + 0.04515821859240532, + 0.04432324320077896, + 0.04429922625422478, + 0.04443158209323883, + 0.04456433653831482, + 0.04350610449910164, + 0.041562095284461975, + 0.039704952389001846, + 0.03815329074859619, + 0.03729764744639397, + 0.03646119311451912, + 0.03564349561929703, + 0.034792885184288025, + 0.03395906835794449, + 0.0331452302634716, + 0.012218805029988289, + 0.012425871565937996, + 0.012756967917084694, + 0.013098782859742641, + 0.013487754389643669, + 0.014002651907503605, + 0.014537205919623375, + 0.015038539655506611, + 0.015504371374845505, + 0.015984633937478065, + 0.016323205083608627, + 0.0166164543479681, + 0.0169149711728096, + 0.017353631556034088, + 0.01780705153942108, + 0.0183525700122118, + 0.019283298403024673, + 0.02026122435927391, + 0.02101464569568634, + 0.021336738020181656, + 0.021663764491677284, + 0.021777575835585594, + 0.021718081086874008, + 0.021658746525645256, + 0.022251080721616745, + 0.023129301145672798, + 0.02404218539595604, + 0.024559026584029198, + 0.025017302483320236, + 0.025484127923846245, + 0.025843005627393723, + 0.026205958798527718, + 0.02664678543806076, + 0.027734532952308655, + 0.028866689652204514, + 0.030092662200331688, + 0.0315677784383297, + 0.033115204423666, + 0.03436405956745148, + 0.03469095751643181, + 0.035020966082811356, + 0.03517830744385719, + 0.03500549495220184, + 0.03483353182673454, + 0.035197868943214417, + 0.03641491383314133, + 0.037674035876989365, + 0.038544103503227234, + 0.03884255513548851, + 0.03914331644773483, + 0.03948095813393593, + 0.03986611217260361, + 0.04025503247976303, + 0.04061000049114227, + 0.04091891646385193, + 0.041230183094739914, + 0.041732121258974075, + 0.04250868409872055, + 0.04329970106482506, + 0.044188208878040314, + 0.04523323476314545, + 0.046302974224090576, + 0.047217436134815216, + 0.04777150973677635, + 0.048332080245018005, + 0.04858461022377014, + 0.04792620614171028, + 0.047276727855205536, + 0.04705692082643509, + 0.04898957535624504, + 0.05100160464644432, + 0.05286915972828865, + 0.051304008811712265, + 0.04978519305586815, + 0.04831133782863617, + 0.048793546855449677, + 0.0494115985929966, + 0.05003747716546059, + 0.050247740000486374, + 0.05035104602575302, + 0.05045457184314728, + 0.05006527528166771, + 0.049403946846723557, + 0.048751357942819595, + 0.04819836467504501, + 0.047756608575582504, + 0.04731890186667442, + 0.04696613922715187, + 0.04683641716837883, + 0.04670705646276474, + 0.04658573120832443, + 0.04659536853432655, + 0.04660501331090927, + 0.04661465436220169, + 0.046194449067115784, + 0.0456882081925869, + 0.04518750682473183, + 0.044332168996334076, + 0.04323525354266167, + 0.04216547682881355, + 0.04108094424009323, + 0.039934881031513214, + 0.038820791989564896, + 0.037748344242572784, + 0.03712131083011627, + 0.03650468960404396, + 0.03589831292629242, + 0.03562348335981369, + 0.03547533228993416, + 0.03532779961824417, + 0.03487671911716461, + 0.03398200497031212, + 0.03311024606227875, + 0.011911573819816113, + 0.012879093177616596, + 0.013178017921745777, + 0.013005443848669529, + 0.012835130095481873, + 0.013164706528186798, + 0.013578640297055244, + 0.014019180089235306, + 0.014571314677596092, + 0.015145194716751575, + 0.015731917694211006, + 0.01632370613515377, + 0.016937756910920143, + 0.017569290474057198, + 0.01822027377784252, + 0.018895374611020088, + 0.019211063161492348, + 0.01943155564367771, + 0.01965457759797573, + 0.020092377439141273, + 0.020543377846479416, + 0.021080609411001205, + 0.02204800210893154, + 0.023059789091348648, + 0.023807194083929062, + 0.02390674315392971, + 0.024006709456443787, + 0.024243604391813278, + 0.024644402787089348, + 0.02505183033645153, + 0.025691701099276543, + 0.026510635390877724, + 0.027355670928955078, + 0.02861095778644085, + 0.03009742870926857, + 0.031661126762628555, + 0.03228681907057762, + 0.032661184668540955, + 0.033039890229701996, + 0.03380882740020752, + 0.03465365245938301, + 0.03551958128809929, + 0.03709400072693825, + 0.0387890450656414, + 0.04056154564023018, + 0.03993977978825569, + 0.03927841782569885, + 0.03864813223481178, + 0.040533579885959625, + 0.04251101240515709, + 0.04454220458865166, + 0.044516049325466156, + 0.04448990523815155, + 0.044461801648139954, + 0.04430219903588295, + 0.04414317011833191, + 0.04398471117019653, + 0.0453166589140892, + 0.04670030623674393, + 0.04812619835138321, + 0.04870927706360817, + 0.04925628378987312, + 0.04980943724513054, + 0.04993292689323425, + 0.050007082521915436, + 0.05008135363459587, + 0.05054105073213577, + 0.05108834430575371, + 0.0516415573656559, + 0.05130864307284355, + 0.050659406930208206, + 0.05001838505268097, + 0.05004056543111801, + 0.05045979842543602, + 0.050882548093795776, + 0.05149805545806885, + 0.05231360346078873, + 0.05314207077026367, + 0.05308783799409866, + 0.05145372450351715, + 0.04986990615725517, + 0.0485779270529747, + 0.04830846190452576, + 0.048040490597486496, + 0.04776999354362488, + 0.047261349856853485, + 0.04675811901688576, + 0.046260252594947815, + 0.045679643750190735, + 0.04508720338344574, + 0.04450244456529617, + 0.04405072331428528, + 0.0436849519610405, + 0.04332222044467926, + 0.04279741644859314, + 0.04200484976172447, + 0.04122694954276085, + 0.04044535011053085, + 0.039549317210912704, + 0.03867313265800476, + 0.0378163605928421, + 0.037184931337833405, + 0.03659963235259056, + 0.03602354973554611, + 0.034870896488428116, + 0.033322062343358994, + 0.03184201940894127, + 0.03059852495789528, + 0.029883665964007378, + 0.02918550744652748, + 0.02850365824997425, + 0.027989692986011505, + 0.027495956048369408, + 0.0118260458111763, + 0.012517441995441914, + 0.01308461558073759, + 0.013247458264231682, + 0.013412327505648136, + 0.013634542934596539, + 0.01390691939741373, + 0.014184737578034401, + 0.014518579468131065, + 0.014873229898512363, + 0.015240133740007877, + 0.015714891254901886, + 0.016204437240958214, + 0.016714364290237427, + 0.017255684360861778, + 0.01781453751027584, + 0.01850702427327633, + 0.019367512315511703, + 0.02026800625026226, + 0.02099488489329815, + 0.02162882685661316, + 0.022281911224126816, + 0.022953718900680542, + 0.023645563051104546, + 0.02435826137661934, + 0.02525223046541214, + 0.026182228699326515, + 0.02707470953464508, + 0.027470683678984642, + 0.027872446924448013, + 0.028397219255566597, + 0.029297806322574615, + 0.03022695519030094, + 0.031048409640789032, + 0.03163931518793106, + 0.032241467386484146, + 0.03286437690258026, + 0.0335109606385231, + 0.03417026251554489, + 0.035383440554142, + 0.03715332970023155, + 0.03901175409555435, + 0.03980237618088722, + 0.03978963568806648, + 0.03977689892053604, + 0.04057983681559563, + 0.04189920052886009, + 0.043261464685201645, + 0.04391521215438843, + 0.04418120160698891, + 0.04444880038499832, + 0.04547746852040291, + 0.0469270758330822, + 0.04842288792133331, + 0.04878031462430954, + 0.04852929711341858, + 0.048279572278261185, + 0.04891355335712433, + 0.05008058249950409, + 0.05127545818686485, + 0.05169229954481125, + 0.05156032741069794, + 0.051428698003292084, + 0.051651760935783386, + 0.05218813940882683, + 0.05273008346557617, + 0.052902016788721085, + 0.05263326317071915, + 0.052365876734256744, + 0.05212228745222092, + 0.05191856250166893, + 0.051715631037950516, + 0.05163915455341339, + 0.051929790526628494, + 0.05222206562757492, + 0.052376698702573776, + 0.051589012145996094, + 0.05081317201256752, + 0.05004899948835373, + 0.050022292882204056, + 0.0500086210668087, + 0.04999495670199394, + 0.04911762475967407, + 0.04807061329483986, + 0.04704592004418373, + 0.045823268592357635, + 0.044511571526527405, + 0.04323742538690567, + 0.04219347983598709, + 0.041417110711336136, + 0.04065503180027008, + 0.03999055176973343, + 0.03962554782629013, + 0.039263878017663956, + 0.03890550881624222, + 0.03751475736498833, + 0.03616118058562279, + 0.034856442362070084, + 0.03413478657603264, + 0.03362022712826729, + 0.033113427460193634, + 0.03249272704124451, + 0.03174562379717827, + 0.03101569414138794, + 0.03027060627937317, + 0.02939421869814396, + 0.028543202206492424, + 0.027716824784874916, + 0.02725272625684738, + 0.02684924565255642, + 0.02645174041390419, + 0.025716278702020645, + 0.024715950712561607, + 0.010545354336500168, + 0.010861843824386597, + 0.011186627671122551, + 0.011448098346590996, + 0.011715681292116642, + 0.012028280645608902, + 0.01245104894042015, + 0.01288867648690939, + 0.013292119838297367, + 0.013663428835570812, + 0.014045110903680325, + 0.014556563459336758, + 0.015124371275305748, + 0.015714328736066818, + 0.01652841456234455, + 0.01738773100078106, + 0.01823057048022747, + 0.018841855227947235, + 0.019473638385534286, + 0.020094087347388268, + 0.02067890390753746, + 0.021280741319060326, + 0.021896574646234512, + 0.022527243942022324, + 0.023176079615950584, + 0.023972555994987488, + 0.024852663278579712, + 0.025765080004930496, + 0.02670692279934883, + 0.027682416141033173, + 0.028693540021777153, + 0.02991451695561409, + 0.03119352087378502, + 0.032514527440071106, + 0.03372843191027641, + 0.03498765453696251, + 0.03614267706871033, + 0.03656028211116791, + 0.036982711404561996, + 0.03755304589867592, + 0.03859429806470871, + 0.03966442495584488, + 0.04070976749062538, + 0.04165176674723625, + 0.04261556267738342, + 0.04370734468102455, + 0.0450378879904747, + 0.04640893638134003, + 0.04791802912950516, + 0.04964948818087578, + 0.05144351348280907, + 0.052841149270534515, + 0.05349097400903702, + 0.05414878949522972, + 0.05451781675219536, + 0.054372482001781464, + 0.05422753468155861, + 0.05469415336847305, + 0.05638691410422325, + 0.058132071048021317, + 0.059288594871759415, + 0.058939121663570404, + 0.058591704815626144, + 0.05830083414912224, + 0.05818696320056915, + 0.058073315769433975, + 0.0578593909740448, + 0.0571204237639904, + 0.05639089643955231, + 0.05571011081337929, + 0.05560338869690895, + 0.05549687147140503, + 0.055390555411577225, + 0.05448254570364952, + 0.053550638258457184, + 0.052634671330451965, + 0.051122426986694336, + 0.04952697828412056, + 0.04798131808638573, + 0.04668811336159706, + 0.04552523046731949, + 0.04439131170511246, + 0.04358329996466637, + 0.04307118430733681, + 0.04256507754325867, + 0.041939325630664825, + 0.041071075946092606, + 0.04022080451250076, + 0.03931267932057381, + 0.03792620822787285, + 0.0365886390209198, + 0.035298243165016174, + 0.034885916858911514, + 0.034561652690172195, + 0.03424040228128433, + 0.03304113820195198, + 0.0314776748418808, + 0.02998819388449192, + 0.029106760397553444, + 0.028996260836720467, + 0.028886180371046066, + 0.028618233278393745, + 0.027437323704361916, + 0.026305142790079117, + 0.02521967887878418, + 0.024849670007824898, + 0.024601751938462257, + 0.024356307461857796, + 0.02370413765311241, + 0.02273760922253132, + 0.021810488775372505, + 0.02091050334274769, + 0.020009765401482582, + 0.009817298501729965, + 0.010186140425503254, + 0.010568838566541672, + 0.011142509058117867, + 0.011791277676820755, + 0.012456442229449749, + 0.012883160263299942, + 0.013324495404958725, + 0.013727343641221523, + 0.014027724973857403, + 0.014334678649902344, + 0.0146351158618927, + 0.014931120909750462, + 0.015233113430440426, + 0.01589304208755493, + 0.016689669340848923, + 0.017526226118206978, + 0.01781906560063362, + 0.0181030984967947, + 0.01849718764424324, + 0.019461240619421005, + 0.020475538447499275, + 0.021527472883462906, + 0.02260155789554119, + 0.023729233071208, + 0.024745207279920578, + 0.02562255784869194, + 0.02653101459145546, + 0.027871595695614815, + 0.02953268587589264, + 0.03129278123378754, + 0.03207879140973091, + 0.03252282738685608, + 0.03297301381826401, + 0.03489813953638077, + 0.037204790860414505, + 0.039663903415203094, + 0.040062397718429565, + 0.040338799357414246, + 0.040638916194438934, + 0.042105358093976974, + 0.043624717742204666, + 0.04513657093048096, + 0.045920953154563904, + 0.04671896621584892, + 0.04762468859553337, + 0.04928246885538101, + 0.05099795386195183, + 0.05267100781202316, + 0.05375370755791664, + 0.05485866591334343, + 0.05586331710219383, + 0.056162457913160324, + 0.056463200598955154, + 0.057022642344236374, + 0.05925659090280533, + 0.06157805770635605, + 0.06359844654798508, + 0.0624864362180233, + 0.06139388307929039, + 0.06039706990122795, + 0.060501690953969955, + 0.060606494545936584, + 0.06071045994758606, + 0.06058246269822121, + 0.06045473739504814, + 0.060327280312776566, + 0.05869957432150841, + 0.057000599801540375, + 0.05535079538822174, + 0.054749928414821625, + 0.05436050519347191, + 0.05397384986281395, + 0.052731532603502274, + 0.051190271973609924, + 0.049694061279296875, + 0.048428911715745926, + 0.04732535406947136, + 0.04624694213271141, + 0.0451161190867424, + 0.043916601687669754, + 0.04274897649884224, + 0.04170747846364975, + 0.040941447019577026, + 0.040189485996961594, + 0.03937194496393204, + 0.03776735067367554, + 0.036228153854608536, + 0.034751687198877335, + 0.03395698964595795, + 0.03325996547937393, + 0.03257725387811661, + 0.03154939040541649, + 0.030380386859178543, + 0.029254699125885963, + 0.02819429151713848, + 0.027202840894460678, + 0.02624625340104103, + 0.025438880547881126, + 0.025208571925759315, + 0.024980349466204643, + 0.02475419081747532, + 0.023957595229148865, + 0.023122966289520264, + 0.022317416965961456, + 0.021694861352443695, + 0.021189667284488678, + 0.020696235820651054, + 0.020276479423046112, + 0.020014764741063118, + 0.01975642889738083, + 0.019501425325870514, + 0.018849752843379974, + 0.00852131936699152, + 0.008800626732409, + 0.009089088067412376, + 0.009362693876028061, + 0.009631837718188763, + 0.009908718056976795, + 0.010411050170660019, + 0.010957155376672745, + 0.011502077803015709, + 0.011927271261811256, + 0.012368183583021164, + 0.012758475728332996, + 0.01306126918643713, + 0.013371245935559273, + 0.0138323325663805, + 0.014399582520127296, + 0.014990095049142838, + 0.01562817208468914, + 0.016298560425639153, + 0.016999414190649986, + 0.017890775576233864, + 0.018828874453902245, + 0.019726930186152458, + 0.02024908922612667, + 0.020785069093108177, + 0.02151956409215927, + 0.02266491949558258, + 0.02387123368680477, + 0.025355519726872444, + 0.02718839980661869, + 0.029153775423765182, + 0.030708909034729004, + 0.03195447474718094, + 0.033250562846660614, + 0.03498028591275215, + 0.03697419911623001, + 0.039081767201423645, + 0.040164023637771606, + 0.04096455127000809, + 0.04178103804588318, + 0.043572694063186646, + 0.04560581594705582, + 0.04773380607366562, + 0.05019298568367958, + 0.05280119925737381, + 0.05554494634270668, + 0.05560615286231041, + 0.055539775639772415, + 0.05547347664833069, + 0.057058267295360565, + 0.05872637405991554, + 0.060443244874477386, + 0.06229858845472336, + 0.06421231478452682, + 0.06618484109640121, + 0.06844624876976013, + 0.07079137116670609, + 0.07321684062480927, + 0.07071366161108017, + 0.06802741438150406, + 0.06544322520494461, + 0.06490697711706161, + 0.06459216773509979, + 0.06427889317274094, + 0.06340550631284714, + 0.062437836080789566, + 0.06148494407534599, + 0.06244708597660065, + 0.06404932588338852, + 0.06569267809391022, + 0.06395313143730164, + 0.06062574312090874, + 0.057471487671136856, + 0.055120114237070084, + 0.05337534099817276, + 0.051685791462659836, + 0.049791574478149414, + 0.04762036353349686, + 0.04554383456707001, + 0.04373900219798088, + 0.042487092316150665, + 0.041271016001701355, + 0.039975062012672424, + 0.03773223236203194, + 0.035615235567092896, + 0.033617015928030014, + 0.032508764415979385, + 0.031508054584264755, + 0.030538152903318405, + 0.029491998255252838, + 0.02844029664993286, + 0.0274261012673378, + 0.02676500380039215, + 0.026444759219884872, + 0.02612834796309471, + 0.025658056139945984, + 0.02474103681743145, + 0.023856794461607933, + 0.023004155606031418, + 0.022091787308454514, + 0.02121509052813053, + 0.020373186096549034, + 0.019676420837640762, + 0.019045986235141754, + 0.018435750156641006, + 0.017956692725419998, + 0.017638908699154854, + 0.01732674427330494, + 0.01699669100344181, + 0.01649029739201069, + 0.01599898934364319, + 0.015522319823503494, + 0.015028920024633408, + 0.006762723438441753, + 0.006896378472447395, + 0.007032675668597221, + 0.007241074461489916, + 0.007509005255997181, + 0.007786849979311228, + 0.008059739135205746, + 0.008339136838912964, + 0.008624679408967495, + 0.00888077449053526, + 0.009144473820924759, + 0.009468255564570427, + 0.009920945391058922, + 0.010395278222858906, + 0.011024129576981068, + 0.011814553290605545, + 0.012661647982895374, + 0.013198534026741982, + 0.01362102571874857, + 0.014057041145861149, + 0.014735827222466469, + 0.015468570403754711, + 0.01623063161969185, + 0.0169536080211401, + 0.01770878955721855, + 0.018542619422078133, + 0.019564278423786163, + 0.020642228424549103, + 0.021740328520536423, + 0.022829245775938034, + 0.023972706869244576, + 0.02565622702240944, + 0.027984853833913803, + 0.030524834990501404, + 0.03227914497256279, + 0.033449217677116394, + 0.034661706537008286, + 0.03641020879149437, + 0.038478173315525055, + 0.040663592517375946, + 0.042304519563913345, + 0.04380014166235924, + 0.0453486405313015, + 0.04807696491479874, + 0.05123415216803551, + 0.054598674178123474, + 0.05648079887032509, + 0.05814454331994057, + 0.059857290238142014, + 0.062071483582258224, + 0.06443066895008087, + 0.0668795183300972, + 0.06905262172222137, + 0.07124797254800797, + 0.07351311296224594, + 0.07473933696746826, + 0.07582678645849228, + 0.07693006098270416, + 0.07824874669313431, + 0.07962669432163239, + 0.08102890849113464, + 0.07990944385528564, + 0.07819584757089615, + 0.07651899755001068, + 0.07604167610406876, + 0.07598020881414413, + 0.0759187862277031, + 0.0737478956580162, + 0.07060103118419647, + 0.0675884410738945, + 0.06527765095233917, + 0.0634813904762268, + 0.06173456087708473, + 0.05901240557432175, + 0.05522241070866585, + 0.05167583003640175, + 0.04869632422924042, + 0.04659328609704971, + 0.04458107054233551, + 0.04264329373836517, + 0.040729276835918427, + 0.03890116512775421, + 0.03715510293841362, + 0.03563380613923073, + 0.03417525067925453, + 0.032776396721601486, + 0.03162628412246704, + 0.03055969439446926, + 0.02952907793223858, + 0.028138285502791405, + 0.026572752743959427, + 0.025094320997595787, + 0.023825280368328094, + 0.02281379885971546, + 0.0218452550470829, + 0.02096637897193432, + 0.02039724960923195, + 0.01984357088804245, + 0.019304919987916946, + 0.018678070977330208, + 0.018059084191918373, + 0.01746060699224472, + 0.017117425799369812, + 0.01692918874323368, + 0.016743021085858345, + 0.016453759744763374, + 0.01594889909029007, + 0.015459530055522919, + 0.01498471014201641, + 0.014390992000699043, + 0.013820796273648739, + 0.013273193500936031, + 0.012752635404467583, + 0.006189750041812658, + 0.006352045573294163, + 0.006518596317619085, + 0.006704575847834349, + 0.006908817682415247, + 0.007119282148778439, + 0.007440266199409962, + 0.0078018177300691605, + 0.008186349645256996, + 0.008687333203852177, + 0.009218974970281124, + 0.009688517078757286, + 0.009939339011907578, + 0.010196654126048088, + 0.010457757860422134, + 0.010722644627094269, + 0.010994239710271358, + 0.01151921134442091, + 0.012179447337985039, + 0.012877522967755795, + 0.01328854076564312, + 0.013671096414327621, + 0.01409592293202877, + 0.01506852637976408, + 0.016108239069581032, + 0.01718270592391491, + 0.018181955441832542, + 0.01923931948840618, + 0.02035476639866829, + 0.021528134122490883, + 0.022769136354327202, + 0.023837124928832054, + 0.024668069556355476, + 0.02552798017859459, + 0.027246018871665, + 0.029755834490060806, + 0.032496847212314606, + 0.034539587795734406, + 0.03620393946766853, + 0.037948496639728546, + 0.03922785446047783, + 0.04034571722149849, + 0.0414954349398613, + 0.043499525636434555, + 0.045834142714738846, + 0.048294056206941605, + 0.05033593252301216, + 0.05234525352716446, + 0.05443478003144264, + 0.05634184181690216, + 0.058267004787921906, + 0.06025795638561249, + 0.06262776255607605, + 0.06514593213796616, + 0.06776535511016846, + 0.06950779259204865, + 0.07110875099897385, + 0.07274658977985382, + 0.07307104021310806, + 0.07309079170227051, + 0.07311055064201355, + 0.0727899819612503, + 0.0723690614104271, + 0.07195058465003967, + 0.07186536490917206, + 0.07191850244998932, + 0.07197168469429016, + 0.0712999477982521, + 0.07020805776119232, + 0.06913290172815323, + 0.06849991530179977, + 0.06825194507837296, + 0.06800487637519836, + 0.06706912070512772, + 0.06519186496734619, + 0.06336715072393417, + 0.06101539731025696, + 0.05734716355800629, + 0.05389946699142456, + 0.0508292019367218, + 0.04901804402470589, + 0.047271426767110825, + 0.04558704420924187, + 0.0427854098379612, + 0.04011344537138939, + 0.03760834410786629, + 0.035764582455158234, + 0.03415056690573692, + 0.03260939195752144, + 0.031246012076735497, + 0.030017197132110596, + 0.028836708515882492, + 0.027683209627866745, + 0.026541393250226974, + 0.02544667199254036, + 0.024437468498945236, + 0.02378101833164692, + 0.023142201825976372, + 0.02252054587006569, + 0.021918214857578278, + 0.021332435309886932, + 0.020762311294674873, + 0.020209666341543198, + 0.019673341885209084, + 0.019151248037815094, + 0.018553609028458595, + 0.017754970118403435, + 0.01699070818722248, + 0.016259342432022095, + 0.015712350606918335, + 0.015188759192824364, + 0.014682617038488388, + 0.014185937121510506, + 0.006083858199417591, + 0.006312284618616104, + 0.006549287587404251, + 0.006805770564824343, + 0.00708044832572341, + 0.007366212550550699, + 0.007710997946560383, + 0.008081597276031971, + 0.008464562706649303, + 0.008804675191640854, + 0.009158453904092312, + 0.009454689919948578, + 0.009602981619536877, + 0.009753599762916565, + 0.01004150602966547, + 0.010460812598466873, + 0.010897628031671047, + 0.01132961269468069, + 0.011770062148571014, + 0.012227634899318218, + 0.012638534419238567, + 0.013057426549494267, + 0.013534823432564735, + 0.01451444998383522, + 0.01556498184800148, + 0.016595110297203064, + 0.017374752089381218, + 0.018191024661064148, + 0.019011592492461205, + 0.01981097273528576, + 0.020643966272473335, + 0.021643195301294327, + 0.022829262539744377, + 0.02408032864332199, + 0.025322305038571358, + 0.02657506801187992, + 0.027889806777238846, + 0.029467036947607994, + 0.031226342543959618, + 0.033090684562921524, + 0.0342903733253479, + 0.03529011085629463, + 0.03631899505853653, + 0.03765248879790306, + 0.039097510278224945, + 0.040597982704639435, + 0.04236428439617157, + 0.04424307867884636, + 0.04620519280433655, + 0.04886911064386368, + 0.05177459120750427, + 0.054852813482284546, + 0.05678963661193848, + 0.058622416108846664, + 0.06051434203982353, + 0.06160222738981247, + 0.06258545815944672, + 0.06358437240123749, + 0.0657532587647438, + 0.0682138055562973, + 0.07076643407344818, + 0.07108832895755768, + 0.07084471732378006, + 0.0706019401550293, + 0.07081636786460876, + 0.07119391113519669, + 0.07157346606254578, + 0.07148037105798721, + 0.0711432695388794, + 0.07080776244401932, + 0.07057064771652222, + 0.07040970772504807, + 0.07024914026260376, + 0.06862661242485046, + 0.06531448662281036, + 0.06216220185160637, + 0.05938055366277695, + 0.057180944830179214, + 0.055062808096408844, + 0.05310390889644623, + 0.051612045615911484, + 0.05016209930181503, + 0.048752881586551666, + 0.04663759842514992, + 0.044611815363168716, + 0.042674027383327484, + 0.041228149086236954, + 0.03992351517081261, + 0.038660164922475815, + 0.03735845535993576, + 0.03605177253484726, + 0.03479079529643059, + 0.033609788864851, + 0.032524071633815765, + 0.03147343173623085, + 0.03054472990334034, + 0.030147336423397064, + 0.029755113646388054, + 0.029367992654442787, + 0.02898390032351017, + 0.028604578226804733, + 0.028230221942067146, + 0.027179023250937462, + 0.02575867623090744, + 0.024412555620074272, + 0.023318342864513397, + 0.02265181764960289, + 0.022004343569278717, + 0.021374385803937912, + 0.020478099584579468, + 0.019619397819042206, + 0.018796702846884727, + 0.018252205103635788, + 0.006719140335917473, + 0.006997338961809874, + 0.007287056650966406, + 0.0075292023830115795, + 0.00774830998852849, + 0.007973793894052505, + 0.008178607560694218, + 0.008386473171412945, + 0.008589853532612324, + 0.008751057088375092, + 0.00891528557986021, + 0.009117873385548592, + 0.009377818554639816, + 0.009645174257457256, + 0.010231944732367992, + 0.011058497242629528, + 0.011951819993555546, + 0.01220343541353941, + 0.012311533093452454, + 0.012428116984665394, + 0.013245569542050362, + 0.01411678921431303, + 0.014909234829246998, + 0.015110526233911514, + 0.015314534306526184, + 0.015632223337888718, + 0.016184361651539803, + 0.016755999997258186, + 0.017568660899996758, + 0.018683254718780518, + 0.01986856199800968, + 0.02088192291557789, + 0.021770816296339035, + 0.02269754558801651, + 0.023855863139033318, + 0.02516087144613266, + 0.02653726562857628, + 0.02700599655508995, + 0.027219416573643684, + 0.02743452414870262, + 0.02855854481458664, + 0.029884997755289078, + 0.03127306327223778, + 0.032202158123254776, + 0.03311002999544144, + 0.03404349461197853, + 0.03609950840473175, + 0.03833441808819771, + 0.04070769622921944, + 0.041648928076028824, + 0.04257696121931076, + 0.04352566972374916, + 0.04501732066273689, + 0.04656870663166046, + 0.048173557966947556, + 0.050030212849378586, + 0.05196400359272957, + 0.05397253856062889, + 0.05488007515668869, + 0.05573467165231705, + 0.056602563709020615, + 0.058529552072286606, + 0.06064264476299286, + 0.06283204257488251, + 0.06445472687482834, + 0.06599248945713043, + 0.06756695359945297, + 0.06758391112089157, + 0.06710236519575119, + 0.0666242390871048, + 0.06608369201421738, + 0.06551425904035568, + 0.06494973599910736, + 0.06367286294698715, + 0.061847422271966934, + 0.06007431447505951, + 0.05876636132597923, + 0.058059826493263245, + 0.05736177787184715, + 0.056578103452920914, + 0.05555130913853645, + 0.054543156176805496, + 0.0535554401576519, + 0.05260463058948517, + 0.05167070031166077, + 0.05075335130095482, + 0.05013800039887428, + 0.04955648258328438, + 0.04898171126842499, + 0.04764055460691452, + 0.046035125851631165, + 0.04448379948735237, + 0.04315236210823059, + 0.04203018546104431, + 0.04093719646334648, + 0.04024359583854675, + 0.040667224675416946, + 0.0410953089594841, + 0.04152790084481239, + 0.04004950076341629, + 0.03861295059323311, + 0.03722792863845825, + 0.03547880798578262, + 0.03365841880440712, + 0.03193143010139465, + 0.030807264149188995, + 0.030410269275307655, + 0.030018392950296402, + 0.02956669218838215, + 0.02861563302576542, + 0.027695167809724808, + 0.026804311200976372, + 0.025624195113778114, + 0.00619230791926384, + 0.00644120154902339, + 0.006700099911540747, + 0.006816181819885969, + 0.00689832866191864, + 0.006990951951593161, + 0.007204728666692972, + 0.00742504233494401, + 0.007645050995051861, + 0.007856454700231552, + 0.00807370524853468, + 0.008429095149040222, + 0.008911320008337498, + 0.009421131573617458, + 0.009965027682483196, + 0.010541833937168121, + 0.011152027174830437, + 0.011433777399361134, + 0.011714060790836811, + 0.01199077907949686, + 0.012219528667628765, + 0.012452642433345318, + 0.012698892503976822, + 0.012967699207365513, + 0.01324219536036253, + 0.013809765689074993, + 0.014722142368555069, + 0.015694795176386833, + 0.0162818506360054, + 0.016619257628917694, + 0.01696365512907505, + 0.017958583310246468, + 0.019245188683271408, + 0.02062397263944149, + 0.021047843620181084, + 0.02130398340523243, + 0.02156323753297329, + 0.022411800920963287, + 0.023329460993409157, + 0.02429872378706932, + 0.02608327940106392, + 0.027998894453048706, + 0.029867181554436684, + 0.0295113492757082, + 0.029159754514694214, + 0.029077140614390373, + 0.031086083501577377, + 0.033233821392059326, + 0.03525989130139351, + 0.035692352801561356, + 0.03613012284040451, + 0.03664690628647804, + 0.03760901466012001, + 0.03859638050198555, + 0.03960511460900307, + 0.040610697120428085, + 0.041641805320978165, + 0.04277163743972778, + 0.0445421002805233, + 0.04638585448265076, + 0.04823886975646019, + 0.0491824634373188, + 0.050144512206315994, + 0.05112414434552193, + 0.05183698236942291, + 0.052559759467840195, + 0.053292617201805115, + 0.053593553602695465, + 0.05386078730225563, + 0.05412934720516205, + 0.05533735826611519, + 0.05677061155438423, + 0.058240991085767746, + 0.05941460654139519, + 0.06047749146819115, + 0.06155938282608986, + 0.06116308644413948, + 0.05973978713154793, + 0.0583496168255806, + 0.05745770037174225, + 0.05717460438609123, + 0.05689289793372154, + 0.05661187693476677, + 0.05633034557104111, + 0.056050218641757965, + 0.05578930675983429, + 0.05571536719799042, + 0.055641528218984604, + 0.05556778609752655, + 0.05624540522694588, + 0.05703054368495941, + 0.057826634496450424, + 0.05733885243535042, + 0.056219685822725296, + 0.05512237176299095, + 0.05438908189535141, + 0.05412257835268974, + 0.053857386112213135, + 0.05340377241373062, + 0.05204838514328003, + 0.05072740465402603, + 0.04943994805216789, + 0.048394810408353806, + 0.04739571735262871, + 0.046417251229286194, + 0.04550238698720932, + 0.0446336604654789, + 0.04378151148557663, + 0.042498670518398285, + 0.040213026106357574, + 0.03805030882358551, + 0.03600390627980232, + 0.034835051745176315, + 0.005820926744490862, + 0.006126766093075275, + 0.006443501450121403, + 0.006463042926043272, + 0.006482644006609917, + 0.006575975567102432, + 0.006864618975669146, + 0.007165932096540928, + 0.0074653467163443565, + 0.007763451896607876, + 0.00807346124202013, + 0.008302945643663406, + 0.00851011648774147, + 0.00872245617210865, + 0.008991792798042297, + 0.009270214475691319, + 0.00955286156386137, + 0.009824737906455994, + 0.010104351677000523, + 0.010438750497996807, + 0.010864732787013054, + 0.011308097280561924, + 0.011737039312720299, + 0.012154529802501202, + 0.012586870230734348, + 0.013038444332778454, + 0.013507897965610027, + 0.013994253240525723, + 0.01443161815404892, + 0.014870001003146172, + 0.015321698971092701, + 0.015851669013500214, + 0.016402218490839005, + 0.01700110174715519, + 0.018000463023781776, + 0.01905856654047966, + 0.020022157579660416, + 0.020225895568728447, + 0.02043171040713787, + 0.02077840268611908, + 0.02158280275762081, + 0.022418342530727386, + 0.023159794509410858, + 0.023621974512934685, + 0.024093378335237503, + 0.024599390104413033, + 0.025165962055325508, + 0.025745583698153496, + 0.026453165337443352, + 0.027386056259274483, + 0.02835184894502163, + 0.02918451465666294, + 0.029755031690001488, + 0.03033670410513878, + 0.03109513223171234, + 0.03217003121972084, + 0.0332820899784565, + 0.03411124646663666, + 0.034327663481235504, + 0.03454545512795448, + 0.035199668258428574, + 0.036941710859537125, + 0.03876997157931328, + 0.040094487369060516, + 0.039539530873298645, + 0.0389922559261322, + 0.038621217012405396, + 0.039148010313510895, + 0.039681993424892426, + 0.04028412327170372, + 0.041798800230026245, + 0.043370429426431656, + 0.04500114545226097, + 0.045658521354198456, + 0.0462740920484066, + 0.04689795523881912, + 0.04796779900789261, + 0.049158643931150436, + 0.05037904903292656, + 0.051248785108327866, + 0.05194895341992378, + 0.05265869200229645, + 0.05394076183438301, + 0.05581052973866463, + 0.05774511769413948, + 0.05923108384013176, + 0.059688739478588104, + 0.060149937868118286, + 0.060593750327825546, + 0.060897260904312134, + 0.061202291399240494, + 0.06150885298848152, + 0.06243898347020149, + 0.06344656646251678, + 0.06447041034698486, + 0.06577368825674057, + 0.06723440438508987, + 0.06872755289077759, + 0.07009929418563843, + 0.07127884775400162, + 0.07247824966907501, + 0.07368578761816025, + 0.07484060525894165, + 0.07601352035999298, + 0.07720482349395752, + 0.07495773583650589, + 0.0722082108259201, + 0.06955953687429428, + 0.06789112091064453, + 0.06700123846530914, + 0.06612302362918854, + 0.06463798135519028, + 0.06099462881684303, + 0.00420855637639761, + 0.004365092609077692, + 0.00452553853392601, + 0.004686818923801184, + 0.004853847436606884, + 0.005028347484767437, + 0.005210417322814465, + 0.005399079993367195, + 0.005592126864939928, + 0.005791442468762398, + 0.005998695734888315, + 0.006236514542251825, + 0.006483761593699455, + 0.0067317551001906395, + 0.006962059065699577, + 0.0072002410888671875, + 0.007465098053216934, + 0.007762182503938675, + 0.00807109009474516, + 0.00842211116105318, + 0.008805165998637676, + 0.009205642156302929, + 0.009485499933362007, + 0.009743515402078629, + 0.010008548386394978, + 0.01029153261333704, + 0.010582732036709785, + 0.010898084379732609, + 0.011341163888573647, + 0.011802258901298046, + 0.012277884408831596, + 0.012759355828166008, + 0.0132597079500556, + 0.013670028187334538, + 0.013891167938709259, + 0.014115885831415653, + 0.014447097666561604, + 0.014916281215846539, + 0.015400703996419907, + 0.01584259793162346, + 0.01624319888651371, + 0.01665393076837063, + 0.01710282266139984, + 0.017584068700671196, + 0.01807885430753231, + 0.018594305962324142, + 0.019128557294607162, + 0.019678156822919846, + 0.020165832713246346, + 0.02062373422086239, + 0.02109203301370144, + 0.021369734779000282, + 0.021548926830291748, + 0.021729622036218643, + 0.022039063274860382, + 0.022420426830649376, + 0.022808387875556946, + 0.02334422618150711, + 0.02397664450109005, + 0.024626197293400764, + 0.025069482624530792, + 0.025365116074681282, + 0.025664236396551132, + 0.026170574128627777, + 0.02686934918165207, + 0.027586784213781357, + 0.028327006846666336, + 0.029091492295265198, + 0.02987660840153694, + 0.03068467043340206, + 0.031517721712589264, + 0.03237338736653328, + 0.03339583799242973, + 0.034885331988334656, + 0.03644125908613205, + 0.03794050216674805, + 0.03861779719591141, + 0.03930718079209328, + 0.040008869022130966, + 0.042336564511060715, + 0.04483070969581604, + 0.0474717915058136, + 0.05042307823896408, + 0.05359411612153053, + 0.056964579969644547, + 0.05876706913113594, + 0.059610508382320404, + 0.06046605110168457, + 0.06209705024957657, + 0.06478574126958847, + 0.0675908550620079, + 0.07039988785982132, + 0.0728994756937027, + 0.07548781484365463, + 0.07816804945468903, + 0.08055071532726288, + 0.08300086855888367, + 0.08552554994821548, + 0.08716946840286255, + 0.08849416673183441, + 0.08983898162841797, + 0.09234347194433212, + 0.09629710763692856, + 0.1004200130701065, + 0.10397345572710037, + 0.10402046889066696, + 0.10406751930713654, + 0.1041145846247673, + 0.10254336893558502, + 0.10074674338102341, + 0.09898160398006439, + 0.0961446613073349, + 0.09247322380542755, + 0.004264130722731352, + 0.0046185655519366264, + 0.004757517017424107, + 0.004742103163152933, + 0.004726739600300789, + 0.004898387473076582, + 0.005105082876980305, + 0.005316095892339945, + 0.00550425099208951, + 0.005699065513908863, + 0.00587944220751524, + 0.00602733064442873, + 0.0061789387837052345, + 0.0063815345056355, + 0.006625303998589516, + 0.006878385785967112, + 0.007183812092989683, + 0.007514445576816797, + 0.007860297337174416, + 0.008069304749369621, + 0.008281415328383446, + 0.00851315725594759, + 0.008827895857393742, + 0.009154270403087139, + 0.009528315626084805, + 0.009997325018048286, + 0.010489420965313911, + 0.010922742076218128, + 0.011274117045104504, + 0.011636795476078987, + 0.011842409148812294, + 0.011933282017707825, + 0.012024853378534317, + 0.012289653532207012, + 0.012636666186153889, + 0.01299347821623087, + 0.01345860306173563, + 0.013966823928058147, + 0.014494238421320915, + 0.01478174701333046, + 0.01503667701035738, + 0.01529600564390421, + 0.015611100941896439, + 0.015936367213726044, + 0.0162684116512537, + 0.016834743320941925, + 0.017425715923309326, + 0.01803339459002018, + 0.018156975507736206, + 0.018281403928995132, + 0.0184148158878088, + 0.01895762048661709, + 0.01951642706990242, + 0.020085113123059273, + 0.020223520696163177, + 0.020362885668873787, + 0.0205032080411911, + 0.02138832025229931, + 0.022317396476864815, + 0.02328682877123356, + 0.02322843112051487, + 0.023119591176509857, + 0.023011263459920883, + 0.023383773863315582, + 0.023818684741854668, + 0.024261685088276863, + 0.025102829560637474, + 0.026060042902827263, + 0.02705376036465168, + 0.02781841531395912, + 0.028505535796284676, + 0.02920963056385517, + 0.030143877491354942, + 0.031240375712513924, + 0.03237675875425339, + 0.03364625573158264, + 0.03506135568022728, + 0.036535970866680145, + 0.03815052658319473, + 0.03998390957713127, + 0.041905395686626434, + 0.04392283037304878, + 0.04605298116803169, + 0.04828643426299095, + 0.0506448969244957, + 0.05418408662080765, + 0.05797060206532478, + 0.06202172487974167, + 0.06352159380912781, + 0.0644354522228241, + 0.06536245346069336, + 0.06729673594236374, + 0.06996545195579529, + 0.07274001091718674, + 0.07534199953079224, + 0.07754496484994888, + 0.07981234788894653, + 0.08215803653001785, + 0.08466290682554245, + 0.08724414557218552, + 0.08990408480167389, + 0.09291969239711761, + 0.09608613699674606, + 0.09936050325632095, + 0.10468246042728424, + 0.1118972972035408, + 0.11960938572883606, + 0.12603694200515747, + 0.12742532789707184, + 0.1288290023803711, + 0.13024815917015076, + 0.1221587285399437, + 0.11394347995519638, + 0.0051420461386442184, + 0.00529294041916728, + 0.005680170841515064, + 0.00609961012378335, + 0.006458960007876158, + 0.006566689815372229, + 0.00667621660977602, + 0.0069283777847886086, + 0.007332430686801672, + 0.007760046981275082, + 0.007995807565748692, + 0.008166225627064705, + 0.008340276777744293, + 0.008436294272542, + 0.008531409315764904, + 0.008673819713294506, + 0.009028520435094833, + 0.009397726505994797, + 0.009729938581585884, + 0.009985871613025665, + 0.010248536244034767, + 0.010595455765724182, + 0.011018502525985241, + 0.011458439752459526, + 0.011759055778384209, + 0.01200459711253643, + 0.012255266308784485, + 0.012740205973386765, + 0.013282704167068005, + 0.01384830567985773, + 0.014180202037096024, + 0.014517893083393574, + 0.014901222661137581, + 0.015627847984433174, + 0.016389908269047737, + 0.017020326107740402, + 0.01699833758175373, + 0.01697637513279915, + 0.01704234443604946, + 0.01733497716486454, + 0.017632635310292244, + 0.018123243004083633, + 0.018997348845005035, + 0.01991361193358898, + 0.02063930407166481, + 0.021022379398345947, + 0.0214125644415617, + 0.021572954952716827, + 0.021415183320641518, + 0.021258564665913582, + 0.021457551047205925, + 0.022124702110886574, + 0.02281259372830391, + 0.023241383954882622, + 0.023313773795962334, + 0.023386385291814804, + 0.023627441376447678, + 0.02411116287112236, + 0.024604789912700653, + 0.02495851181447506, + 0.02507077343761921, + 0.0251835398375988, + 0.025452962145209312, + 0.026054618880152702, + 0.02667049691081047, + 0.027388866990804672, + 0.028392041102051735, + 0.029431955888867378, + 0.030462194234132767, + 0.03128250688314438, + 0.03212491050362587, + 0.03295658156275749, + 0.03328615799546242, + 0.03361903131008148, + 0.03395523875951767, + 0.03525244817137718, + 0.03666622191667557, + 0.038136694580316544, + 0.03943770006299019, + 0.04072309657931328, + 0.04205038398504257, + 0.0446818582713604, + 0.04825422912836075, + 0.05211222171783447, + 0.05442033335566521, + 0.05465139076113701, + 0.054883431643247604, + 0.05615472421050072, + 0.060464046895504, + 0.06510407477617264, + 0.06981879472732544, + 0.06991508603096008, + 0.07001151144504547, + 0.0701080709695816, + 0.0728379637002945, + 0.07626733928918839, + 0.07985817641019821, + 0.08242902159690857, + 0.08419204503297806, + 0.08599276840686798, + 0.08817179501056671, + 0.09118789434432983, + 0.09430715441703796, + 0.09743845462799072, + 0.09681583940982819, + 0.0961972028017044, + 0.0955825224518776, + 0.09765119105577469, + 0.10084760934114456, + 0.10414863377809525, + 0.10355501621961594, + 0.09722307324409485, + 0.09127829968929291, + 0.004386975429952145, + 0.0045861597172915936, + 0.004696472082287073, + 0.004809437785297632, + 0.005024461541324854, + 0.00529494509100914, + 0.005579989869147539, + 0.005771682597696781, + 0.005964679643511772, + 0.006172598339617252, + 0.006423536688089371, + 0.006684676744043827, + 0.006951627787202597, + 0.007222467567771673, + 0.007503860164433718, + 0.007725454866886139, + 0.007912163622677326, + 0.0081033855676651, + 0.008396810851991177, + 0.008721492253243923, + 0.009058542549610138, + 0.009391953237354755, + 0.009737635962665081, + 0.01010985393077135, + 0.010563978925347328, + 0.011038501746952534, + 0.011440876871347427, + 0.01165780983865261, + 0.01187885645776987, + 0.01221633329987526, + 0.01270284689962864, + 0.01320873573422432, + 0.013637883588671684, + 0.014006316661834717, + 0.01438470371067524, + 0.014970987103879452, + 0.01568322256207466, + 0.016429342329502106, + 0.016655756160616875, + 0.016705375164747238, + 0.01675514318048954, + 0.017174633219838142, + 0.017688611522316933, + 0.01821797527372837, + 0.018412884324789047, + 0.018557865172624588, + 0.018703987821936607, + 0.018831880763173103, + 0.01895858161151409, + 0.019086133688688278, + 0.019526658579707146, + 0.020004983991384506, + 0.02049502357840538, + 0.021022694185376167, + 0.021566208451986313, + 0.022123774513602257, + 0.02246902883052826, + 0.022795377299189568, + 0.023126468062400818, + 0.023384226486086845, + 0.023633092641830444, + 0.02388460747897625, + 0.02423863671720028, + 0.024620339274406433, + 0.025008050724864006, + 0.025548361241817474, + 0.026150163263082504, + 0.02676614187657833, + 0.02715276926755905, + 0.027421431615948677, + 0.027692748233675957, + 0.02867412194609642, + 0.030272718518972397, + 0.031960438936948776, + 0.03341319039463997, + 0.03450259938836098, + 0.03562753647565842, + 0.036790985614061356, + 0.03799677640199661, + 0.039242085069417953, + 0.0405634269118309, + 0.04213874787092209, + 0.04377524554729462, + 0.045475300401449203, + 0.047343507409095764, + 0.04929119348526001, + 0.05131901055574417, + 0.053430892527103424, + 0.055629875510931015, + 0.05791935324668884, + 0.060881465673446655, + 0.0644497498869896, + 0.06822717934846878, + 0.07195114344358444, + 0.07533518970012665, + 0.07887840270996094, + 0.08269254118204117, + 0.08766959607601166, + 0.09294620156288147, + 0.09854040294885635, + 0.1007910668849945, + 0.10237636417150497, + 0.10398658365011215, + 0.10674348473548889, + 0.11050604283809662, + 0.11440122872591019, + 0.11706462502479553, + 0.11576749384403229, + 0.11448473483324051, + 0.11321618407964706, + 0.10841593891382217, + 0.10358516871929169, + 0.09896966069936752, + 0.014807731844484806, + 0.014936409890651703, + 0.014960733242332935, + 0.01498509757220745, + 0.01509034726768732, + 0.015211515128612518, + 0.015372744761407375, + 0.015887131914496422, + 0.016418732702732086, + 0.016964467242360115, + 0.017521195113658905, + 0.018096189945936203, + 0.01852496899664402, + 0.01883920282125473, + 0.01915876567363739, + 0.019592152908444405, + 0.0200656745582819, + 0.020550642162561417, + 0.020691687241196632, + 0.020827321335673332, + 0.02100277878344059, + 0.021382350474596024, + 0.021768782287836075, + 0.02234579250216484, + 0.023329250514507294, + 0.024355990812182426, + 0.024910906329751015, + 0.02491060644388199, + 0.024910302832722664, + 0.025369007140398026, + 0.02613999880850315, + 0.026934420689940453, + 0.027442025020718575, + 0.027840686962008476, + 0.028245139867067337, + 0.02875771000981331, + 0.029301466420292854, + 0.029855508357286453, + 0.03035837784409523, + 0.030863573774695396, + 0.03137717396020889, + 0.03265506029129028, + 0.03400270268321037, + 0.035386621952056885, + 0.0361672043800354, + 0.036965008825063705, + 0.03775430843234062, + 0.03817082569003105, + 0.03859193995594978, + 0.03902139514684677, + 0.039497822523117065, + 0.03998006135225296, + 0.040428102016448975, + 0.040431998670101166, + 0.04043589532375336, + 0.04045258089900017, + 0.04064972326159477, + 0.04084782674908638, + 0.041025396436452866, + 0.04058244079351425, + 0.040144264698028564, + 0.039710815995931625, + 0.04077186435461044, + 0.04188782349228859, + 0.043034326285123825, + 0.04295586794614792, + 0.042764291167259216, + 0.04257357493042946, + 0.04381159693002701, + 0.04538968205451965, + 0.04702460765838623, + 0.04687054827809334, + 0.046051543205976486, + 0.045246850699186325, + 0.04572778940200806, + 0.04705500230193138, + 0.0484207384288311, + 0.0488700233399868, + 0.048269543796777725, + 0.0476764440536499, + 0.04766768589615822, + 0.0489194393157959, + 0.050204068422317505, + 0.05129653587937355, + 0.051078662276268005, + 0.050861719995737076, + 0.05064569413661957, + 0.050551023334264755, + 0.05046217516064644, + 0.050373487174510956, + 0.0496206060051918, + 0.048659034073352814, + 0.04771609231829643, + 0.047133561223745346, + 0.046871937811374664, + 0.04661176726222038, + 0.046462517231702805, + 0.046601779758930206, + 0.046741463243961334, + 0.046863969415426254, + 0.0456329882144928, + 0.04443433880805969, + 0.04326717555522919, + 0.04198811948299408, + 0.0406961627304554, + 0.039443958550691605, + 0.03876184672117233, + 0.03879091143608093, + 0.03881999850273132, + 0.03877677395939827, + 0.038171034306287766, + 0.03757476434111595, + 0.036987803876399994, + 0.014320183545351028, + 0.014602304436266422, + 0.014431800693273544, + 0.014263288117945194, + 0.014453179202973843, + 0.015197580680251122, + 0.015980323776602745, + 0.016428116708993912, + 0.016692573204636574, + 0.01696128398180008, + 0.017363987863063812, + 0.017791006714105606, + 0.018249256536364555, + 0.018867842853069305, + 0.0195073951035738, + 0.01997346803545952, + 0.02006053924560547, + 0.020147988572716713, + 0.02055874653160572, + 0.021275093778967857, + 0.02201640047132969, + 0.022541262209415436, + 0.022976936772465706, + 0.02342103235423565, + 0.024039186537265778, + 0.024699145928025246, + 0.02537352778017521, + 0.025837481021881104, + 0.026309918612241745, + 0.026762107387185097, + 0.02705148607492447, + 0.0273439958691597, + 0.027812743559479713, + 0.0287953931838274, + 0.029812758788466454, + 0.030708225443959236, + 0.03134136274456978, + 0.03198755159974098, + 0.032816529273986816, + 0.03388993814587593, + 0.03499845787882805, + 0.03549005091190338, + 0.03534979000687599, + 0.03521008417010307, + 0.035846829414367676, + 0.0371464304625988, + 0.03849314898252487, + 0.03873458132147789, + 0.03817301616072655, + 0.037619590759277344, + 0.03758879378437996, + 0.03790521249175072, + 0.038224298506975174, + 0.038905832916498184, + 0.039847731590270996, + 0.040812429040670395, + 0.0411803275346756, + 0.04110266640782356, + 0.041025158017873764, + 0.041890114545822144, + 0.04359893500804901, + 0.0453774631023407, + 0.04622833430767059, + 0.04605976119637489, + 0.04589180275797844, + 0.04586242139339447, + 0.046023763716220856, + 0.046185679733753204, + 0.04648073390126228, + 0.047045957297086716, + 0.04761805757880211, + 0.0481267049908638, + 0.04840104654431343, + 0.04867694526910782, + 0.0489150732755661, + 0.048822157084941864, + 0.048729415982961655, + 0.04863684996962547, + 0.04868724197149277, + 0.048742715269327164, + 0.048798248171806335, + 0.048556555062532425, + 0.04824627563357353, + 0.04793797433376312, + 0.04792351648211479, + 0.048078954219818115, + 0.04823489487171173, + 0.04817057028412819, + 0.04782700911164284, + 0.047485895454883575, + 0.04730202257633209, + 0.047643277794122696, + 0.04798699915409088, + 0.048333197832107544, + 0.04670402407646179, + 0.04512806236743927, + 0.04360527917742729, + 0.043175533413887024, + 0.043096672743558884, + 0.043017953634262085, + 0.04231761395931244, + 0.040990397334098816, + 0.039704807102680206, + 0.03859817609190941, + 0.038062091916799545, + 0.03753345459699631, + 0.03701215609908104, + 0.03649986907839775, + 0.03599487245082855, + 0.03549686819314957, + 0.03480501472949982, + 0.033983051776885986, + 0.033180493861436844, + 0.013542675413191319, + 0.014374769292771816, + 0.014739439822733402, + 0.014940869994461536, + 0.015146726742386818, + 0.015437083318829536, + 0.015733007341623306, + 0.016182642430067062, + 0.01705402322113514, + 0.017972325906157494, + 0.01855088211596012, + 0.018775006756186485, + 0.019001837819814682, + 0.019270997494459152, + 0.019558342173695564, + 0.019849972799420357, + 0.020233534276485443, + 0.020629797130823135, + 0.021060051396489143, + 0.021670157089829445, + 0.022297941148281097, + 0.02308555878698826, + 0.02422761544585228, + 0.025426171720027924, + 0.02601456642150879, + 0.025870783254504204, + 0.02572779729962349, + 0.026098599657416344, + 0.026804285123944283, + 0.027529051527380943, + 0.028126413002610207, + 0.028685254976153374, + 0.029255198314785957, + 0.02996239811182022, + 0.03070848248898983, + 0.03147314116358757, + 0.03282587602734566, + 0.034267447888851166, + 0.0357302650809288, + 0.035880155861377716, + 0.03603067249059677, + 0.0362406000494957, + 0.037033550441265106, + 0.03784384950995445, + 0.03870392218232155, + 0.03978697210550308, + 0.040900327265262604, + 0.04174920171499252, + 0.04115675017237663, + 0.04057270288467407, + 0.040083594620227814, + 0.03998975083231926, + 0.039896126836538315, + 0.040001314133405685, + 0.04104609787464142, + 0.042118169367313385, + 0.04328974708914757, + 0.04489409178495407, + 0.046557895839214325, + 0.048025719821453094, + 0.04759226366877556, + 0.047162726521492004, + 0.046739913523197174, + 0.04636325687170029, + 0.045989636331796646, + 0.04561902955174446, + 0.045977234840393066, + 0.046345725655555725, + 0.04671715945005417, + 0.04809841886162758, + 0.049636851996183395, + 0.051224485039711, + 0.05080988630652428, + 0.049880001693964005, + 0.048967137932777405, + 0.04849300906062126, + 0.048232387751340866, + 0.04797316715121269, + 0.04746812582015991, + 0.04674890637397766, + 0.04604059085249901, + 0.04568824544548988, + 0.045938875526189804, + 0.046190887689590454, + 0.04635799676179886, + 0.04615320265293121, + 0.045949313789606094, + 0.045746322721242905, + 0.04527772217988968, + 0.04481181129813194, + 0.04435069486498833, + 0.04382218047976494, + 0.04327966645359993, + 0.04274386912584305, + 0.04210639372467995, + 0.041390012949705124, + 0.04068581759929657, + 0.03998582437634468, + 0.03927971050143242, + 0.03858605772256851, + 0.03791400417685509, + 0.03757806867361069, + 0.03724510967731476, + 0.03691510111093521, + 0.03625928610563278, + 0.035502780228853226, + 0.03476205840706825, + 0.03414249047636986, + 0.0336691290140152, + 0.03320233151316643, + 0.03266951069235802, + 0.03158067166805267, + 0.030528126284480095, + 0.0124448137357831, + 0.013012304902076721, + 0.0135897072032094, + 0.01417048741132021, + 0.014776088297367096, + 0.015061717480421066, + 0.015201368369162083, + 0.015342316590249538, + 0.015770411118865013, + 0.01622658409178257, + 0.016734756529331207, + 0.017435835674405098, + 0.018166285008192062, + 0.018844928592443466, + 0.019424892961978912, + 0.02002270519733429, + 0.02057620882987976, + 0.02110433205962181, + 0.021646007895469666, + 0.02220960147678852, + 0.02278989553451538, + 0.02338535338640213, + 0.023814331740140915, + 0.02424672432243824, + 0.02475135400891304, + 0.025693217292428017, + 0.026670923456549644, + 0.02762300707399845, + 0.028439728543162346, + 0.02928059734404087, + 0.029907651245594025, + 0.030190248042345047, + 0.030475517734885216, + 0.030926726758480072, + 0.03154294937849045, + 0.032171450555324554, + 0.03303443267941475, + 0.0340694934129715, + 0.03513698652386665, + 0.035869065672159195, + 0.036443162709474564, + 0.03702645003795624, + 0.038034163415431976, + 0.03921712934970856, + 0.04043688625097275, + 0.040976665914058685, + 0.04133019968867302, + 0.041686780750751495, + 0.042674556374549866, + 0.043832555413246155, + 0.04502197727560997, + 0.04519578069448471, + 0.04515199735760689, + 0.04510824754834175, + 0.04539886862039566, + 0.04576554894447327, + 0.04613519459962845, + 0.047067753970623016, + 0.048165857791900635, + 0.049289584159851074, + 0.04901173338294029, + 0.04828760400414467, + 0.04757416993379593, + 0.047731272876262665, + 0.0482645109295845, + 0.04880371317267418, + 0.0488993376493454, + 0.04872674122452736, + 0.04855474829673767, + 0.048492349684238434, + 0.04852559417486191, + 0.048558853566646576, + 0.04891924187541008, + 0.04973400756716728, + 0.05056234449148178, + 0.05074869841337204, + 0.04941030964255333, + 0.04810721427202225, + 0.04705293849110603, + 0.04720548167824745, + 0.04735851287841797, + 0.04751204699277878, + 0.047133076936006546, + 0.04675197973847389, + 0.04637395590543747, + 0.045904647558927536, + 0.04541824758052826, + 0.044937003403902054, + 0.044277723878622055, + 0.04351426661014557, + 0.04276397451758385, + 0.04195529222488403, + 0.04105553403496742, + 0.040175072848796844, + 0.039372097700834274, + 0.038883112370967865, + 0.03840019926428795, + 0.037923283874988556, + 0.037115927785634995, + 0.03629332780838013, + 0.03548896312713623, + 0.0347403921186924, + 0.03402860835194588, + 0.033331405371427536, + 0.03262368217110634, + 0.031885985285043716, + 0.03116496652364731, + 0.03046369180083275, + 0.029853923246264458, + 0.029256360605359077, + 0.02867075987160206, + 0.02847171016037464, + 0.028422892093658447, + 0.012176113203167915, + 0.012735170312225819, + 0.013285567983984947, + 0.013678289018571377, + 0.014082618989050388, + 0.014683159999549389, + 0.015567668713629246, + 0.01650545932352543, + 0.0167001411318779, + 0.016530990600585938, + 0.016363555565476418, + 0.01737333834171295, + 0.01856362447142601, + 0.019644178450107574, + 0.019549338147044182, + 0.0194549560546875, + 0.019663339480757713, + 0.020479537546634674, + 0.021329613402485847, + 0.02207053080201149, + 0.02270485647022724, + 0.023357413709163666, + 0.02404657006263733, + 0.024763884022831917, + 0.02550259418785572, + 0.025896523147821426, + 0.026235394179821014, + 0.02657870203256607, + 0.027641721069812775, + 0.028748303651809692, + 0.02981625311076641, + 0.03031802363693714, + 0.030828235670924187, + 0.03150002658367157, + 0.0327114500105381, + 0.033969465643167496, + 0.035051267594099045, + 0.03568712994456291, + 0.03633452206850052, + 0.037151236087083817, + 0.03823048248887062, + 0.03934108093380928, + 0.04008502513170242, + 0.0403670072555542, + 0.040650974959135056, + 0.04137830808758736, + 0.04257200285792351, + 0.04380013421177864, + 0.04519281163811684, + 0.04675006493926048, + 0.048360977321863174, + 0.049798909574747086, + 0.05107615515589714, + 0.05238616093993187, + 0.0530671626329422, + 0.05316261202096939, + 0.05325823649764061, + 0.05288048833608627, + 0.05204431340098381, + 0.05122135579586029, + 0.050752051174640656, + 0.05068483203649521, + 0.05061769485473633, + 0.05079736188054085, + 0.051348377019166946, + 0.051905371248722076, + 0.05233723670244217, + 0.05249989777803421, + 0.052663061767816544, + 0.05251016467809677, + 0.05132689327001572, + 0.05017028748989105, + 0.049059681594371796, + 0.04811535030603409, + 0.04718920215964317, + 0.0462808795273304, + 0.045759692788124084, + 0.04524712264537811, + 0.04474029690027237, + 0.04401269555091858, + 0.04325662925839424, + 0.04251355305314064, + 0.04253631830215454, + 0.04291420057415962, + 0.04329543188214302, + 0.043481647968292236, + 0.04347092658281326, + 0.04346020147204399, + 0.04277057573199272, + 0.040581054985523224, + 0.03850361704826355, + 0.03671810030937195, + 0.037022218108177185, + 0.03732885792851448, + 0.03763803839683533, + 0.03636869415640831, + 0.034874022006988525, + 0.03344077989459038, + 0.032219111919403076, + 0.031143279746174812, + 0.030103370547294617, + 0.02949731983244419, + 0.029748717322945595, + 0.030002258718013763, + 0.030249590054154396, + 0.030227798968553543, + 0.030206024646759033, + 0.030184265226125717, + 0.029717491939663887, + 0.02908981777727604, + 0.028475401923060417, + 0.02809508517384529, + 0.028060948476195335, + 0.011157778091728687, + 0.011767500080168247, + 0.01241054106503725, + 0.012544549070298672, + 0.01265629380941391, + 0.012909980490803719, + 0.013682352378964424, + 0.014500933699309826, + 0.015085989609360695, + 0.015373210422694683, + 0.015665901824831963, + 0.016277283430099487, + 0.017049230635166168, + 0.017857786267995834, + 0.01825212687253952, + 0.01861850544810295, + 0.019062168896198273, + 0.020008500665426254, + 0.02100181393325329, + 0.021776096895337105, + 0.021987775340676308, + 0.022201508283615112, + 0.02272462472319603, + 0.02359582483768463, + 0.024500427767634392, + 0.025538794696331024, + 0.026678793132305145, + 0.027869679033756256, + 0.028804399073123932, + 0.029681934043765068, + 0.030586201697587967, + 0.03177298977971077, + 0.03303368017077446, + 0.034337688237428665, + 0.035134103149175644, + 0.035948991775512695, + 0.03682965040206909, + 0.038153018802404404, + 0.03952393680810928, + 0.04088412970304489, + 0.04200424626469612, + 0.04315505921840668, + 0.044170308858156204, + 0.04465741291642189, + 0.04514988139271736, + 0.04585811495780945, + 0.04714158549904823, + 0.04846097528934479, + 0.04966999217867851, + 0.050560012459754944, + 0.05146597698330879, + 0.05233487859368324, + 0.053097255527973175, + 0.053870733827352524, + 0.054284825921058655, + 0.05383848398923874, + 0.05339581146836281, + 0.05306441709399223, + 0.053020309656858444, + 0.05297623947262764, + 0.05321173742413521, + 0.05439712852239609, + 0.055608924478292465, + 0.05636991187930107, + 0.05483618006110191, + 0.053344178944826126, + 0.05205434933304787, + 0.05236676707863808, + 0.05268105864524841, + 0.05299723148345947, + 0.05229418724775314, + 0.0515982024371624, + 0.05091147497296333, + 0.049885958433151245, + 0.048837147653102875, + 0.0478103905916214, + 0.04720248281955719, + 0.0467299222946167, + 0.046262096613645554, + 0.04541167616844177, + 0.04433353617787361, + 0.04328099265694618, + 0.04239055886864662, + 0.04168805852532387, + 0.04099719971418381, + 0.040361594408750534, + 0.03985901549458504, + 0.039362698793411255, + 0.03881936892867088, + 0.03745170682668686, + 0.03613222762942314, + 0.03485924005508423, + 0.03388548269867897, + 0.03298639878630638, + 0.032111167907714844, + 0.031570255756378174, + 0.03124207817018032, + 0.03091730922460556, + 0.030508890748023987, + 0.02994478866457939, + 0.02939111925661564, + 0.028871439397335052, + 0.028658898547291756, + 0.028447920456528664, + 0.02823849953711033, + 0.027242830023169518, + 0.026072658598423004, + 0.024952750653028488, + 0.02425123006105423, + 0.023982146754860878, + 0.023716049268841743, + 0.02336576208472252, + 0.022501593455672264, + 0.008936215192079544, + 0.009355348534882069, + 0.009794141165912151, + 0.010293679311871529, + 0.010828590020537376, + 0.011376525275409222, + 0.011762009002268314, + 0.012160553596913815, + 0.012658740393817425, + 0.013366584666073322, + 0.014114011079072952, + 0.014751991257071495, + 0.015294339507818222, + 0.015856623649597168, + 0.016321150586009026, + 0.016764061525464058, + 0.017218992114067078, + 0.017798054963350296, + 0.018399303779006004, + 0.019053788855671883, + 0.019906915724277496, + 0.02079824171960354, + 0.021693678572773933, + 0.02255338802933693, + 0.023447170853614807, + 0.02433634176850319, + 0.025215808302164078, + 0.026127055287361145, + 0.027162926271557808, + 0.028296716511249542, + 0.029477834701538086, + 0.030984243378043175, + 0.03266520798206329, + 0.03443736955523491, + 0.036274295300245285, + 0.03820363059639931, + 0.04023557901382446, + 0.04141978174448013, + 0.04258266091346741, + 0.043805040419101715, + 0.046528805047273636, + 0.04942193254828453, + 0.052178919315338135, + 0.05117618665099144, + 0.05019272491335869, + 0.04950518161058426, + 0.05095813423395157, + 0.05245373025536537, + 0.054064106196165085, + 0.056175973266363144, + 0.058370329439640045, + 0.060208313167095184, + 0.059514373540878296, + 0.05882842838764191, + 0.05836181715130806, + 0.05924273654818535, + 0.060136958956718445, + 0.06086079776287079, + 0.06010224297642708, + 0.059353139251470566, + 0.05861423537135124, + 0.05789671465754509, + 0.05718797445297241, + 0.056491512805223465, + 0.05661708861589432, + 0.05674295127391815, + 0.05686909332871437, + 0.05751952528953552, + 0.05821998789906502, + 0.05892898887395859, + 0.058556508272886276, + 0.057967159897089005, + 0.057383742183446884, + 0.05469547212123871, + 0.05135926976799965, + 0.04822656512260437, + 0.04611815884709358, + 0.04467359185218811, + 0.04327427223324776, + 0.041947923600673676, + 0.040698565542697906, + 0.039486415684223175, + 0.03841973468661308, + 0.03766905143857002, + 0.036933038383722305, + 0.03621198982000351, + 0.03551102057099342, + 0.034823618829250336, + 0.034149523824453354, + 0.03319774940609932, + 0.032236069440841675, + 0.03130225092172623, + 0.030811497941613197, + 0.03053664229810238, + 0.030264241620898247, + 0.02948756143450737, + 0.02808133326470852, + 0.02674216777086258, + 0.02562147006392479, + 0.02528119832277298, + 0.024945445358753204, + 0.02461414970457554, + 0.02421850897371769, + 0.023821363225579262, + 0.023430729284882545, + 0.022755339741706848, + 0.021914752200245857, + 0.021105218678712845, + 0.02038975991308689, + 0.019850734621286392, + 0.01932596042752266, + 0.0188150592148304, + 0.018323512747883797, + 0.008574448525905609, + 0.008977479301393032, + 0.009399454109370708, + 0.00989754032343626, + 0.010444918647408485, + 0.011022569611668587, + 0.011240523308515549, + 0.011457179673016071, + 0.011733709834516048, + 0.012205173261463642, + 0.01269558072090149, + 0.013176778331398964, + 0.013642082922160625, + 0.014123818837106228, + 0.014827549457550049, + 0.01566651277244091, + 0.016552947461605072, + 0.017126936465501785, + 0.01767321489751339, + 0.018266642466187477, + 0.019280219450592995, + 0.020350037142634392, + 0.021384427323937416, + 0.02216225117444992, + 0.022968364879488945, + 0.02375808358192444, + 0.024503013119101524, + 0.025271298363804817, + 0.02631860226392746, + 0.027643097564578056, + 0.029034247621893883, + 0.030366307124495506, + 0.0316888727247715, + 0.03306903690099716, + 0.035275984555482864, + 0.037890125066041946, + 0.040697984397411346, + 0.04160559922456741, + 0.042166244238615036, + 0.04273444414138794, + 0.04462744668126106, + 0.04671984910964966, + 0.04891035333275795, + 0.05025258660316467, + 0.05161197856068611, + 0.053005825728178024, + 0.05432041734457016, + 0.055667612701654434, + 0.057019755244255066, + 0.057758722454309464, + 0.058507271111011505, + 0.059246182441711426, + 0.05961783602833748, + 0.05999182537198067, + 0.060365770012140274, + 0.06068255007266998, + 0.06100098043680191, + 0.061307840049266815, + 0.060451995581388474, + 0.0596080981194973, + 0.05877597630023956, + 0.05804593488574028, + 0.05732804909348488, + 0.05661903694272041, + 0.05618751421570778, + 0.05578739941120148, + 0.0553901270031929, + 0.055663060396909714, + 0.05607978254556656, + 0.05649962276220322, + 0.055652547627687454, + 0.05436139181256294, + 0.05310019105672836, + 0.0516371950507164, + 0.050074752420186996, + 0.048559583723545074, + 0.04743006080389023, + 0.04668290913105011, + 0.04594752937555313, + 0.04519699141383171, + 0.04440658539533615, + 0.043630000203847885, + 0.042636413127183914, + 0.04057082161307335, + 0.03860529884696007, + 0.03673499822616577, + 0.035386040806770325, + 0.03409348800778389, + 0.03284814953804016, + 0.03215399384498596, + 0.03161453455686569, + 0.031084129586815834, + 0.03048914112150669, + 0.029849151149392128, + 0.029222598299384117, + 0.028819436207413673, + 0.028863979503512383, + 0.028908591717481613, + 0.02886708453297615, + 0.027609042823314667, + 0.026405829936265945, + 0.025255052372813225, + 0.024267468601465225, + 0.02334759570658207, + 0.022462589666247368, + 0.022058691829442978, + 0.022119170054793358, + 0.02217981219291687, + 0.022179020568728447, + 0.021905159577727318, + 0.021634679287672043, + 0.02136753685772419, + 0.0202865581959486, + 0.007574658840894699, + 0.007882620207965374, + 0.008203103207051754, + 0.008646439760923386, + 0.00916559062898159, + 0.00971591379493475, + 0.010167822241783142, + 0.010634501464664936, + 0.011004474945366383, + 0.010924149304628372, + 0.01084441039711237, + 0.010966549627482891, + 0.011357632465660572, + 0.01176266185939312, + 0.012255987152457237, + 0.012810825370252132, + 0.013390783220529556, + 0.014203972183167934, + 0.015103835612535477, + 0.01603718474507332, + 0.016462048515677452, + 0.016898170113563538, + 0.01741800643503666, + 0.018234143033623695, + 0.019088517874479294, + 0.019900880753993988, + 0.020599951967597008, + 0.02132358029484749, + 0.02231752872467041, + 0.02361384965479374, + 0.02498546987771988, + 0.02618258073925972, + 0.027278253808617592, + 0.02841978147625923, + 0.029660934582352638, + 0.030976319685578346, + 0.03235003724694252, + 0.03398628905415535, + 0.03575222194194794, + 0.03760990872979164, + 0.039415620267391205, + 0.041289202868938446, + 0.04325185343623161, + 0.044774290174245834, + 0.046320319175720215, + 0.047919727861881256, + 0.04842215031385422, + 0.048915643244981766, + 0.049427248537540436, + 0.05118367820978165, + 0.05300252512097359, + 0.05485977232456207, + 0.05521908029913902, + 0.0555807426571846, + 0.05595915764570236, + 0.05875328555703163, + 0.061686933040618896, + 0.06476705521345139, + 0.06461922079324722, + 0.0643991231918335, + 0.06417978554964066, + 0.06400589644908905, + 0.06383564323186874, + 0.06366585195064545, + 0.06461203843355179, + 0.06574060767889023, + 0.06688889116048813, + 0.06529400497674942, + 0.06304918229579926, + 0.06088154390454292, + 0.059628285467624664, + 0.05876390263438225, + 0.05791205167770386, + 0.05696145445108414, + 0.05594807490706444, + 0.054952725768089294, + 0.05337461084127426, + 0.05113869532942772, + 0.0489964485168457, + 0.047318894416093826, + 0.04655046761035919, + 0.045794516801834106, + 0.044955864548683167, + 0.043535422533750534, + 0.04215985909104347, + 0.040827762335538864, + 0.03983279690146446, + 0.038877516984939575, + 0.03794514387845993, + 0.036795418709516525, + 0.03560194373130798, + 0.03444717824459076, + 0.03343091905117035, + 0.032533399760723114, + 0.03165997937321663, + 0.030915578827261925, + 0.030446819961071014, + 0.02998516708612442, + 0.02951885387301445, + 0.028682922944426537, + 0.027870668098330498, + 0.027081411331892014, + 0.02662971056997776, + 0.026287604123353958, + 0.025949891656637192, + 0.02531421184539795, + 0.02435188554227352, + 0.02342614345252514, + 0.022631600499153137, + 0.02240997552871704, + 0.022190522402524948, + 0.02197321504354477, + 0.021092277020215988, + 0.00550301605835557, + 0.005696647334843874, + 0.005897092167288065, + 0.006102635990828276, + 0.006314566358923912, + 0.0065338569693267345, + 0.006753798574209213, + 0.006981040816754103, + 0.007302593439817429, + 0.007942788302898407, + 0.008639106526970863, + 0.009078693576157093, + 0.009173677302896976, + 0.0092696538195014, + 0.00947897881269455, + 0.009746428579092026, + 0.010021423920989037, + 0.010311429388821125, + 0.010610786266624928, + 0.010928197763860226, + 0.011380065232515335, + 0.011850615963339806, + 0.012397543527185917, + 0.013157994486391544, + 0.013965090736746788, + 0.01469730120152235, + 0.015270359814167023, + 0.015865759924054146, + 0.016557591035962105, + 0.017346534878015518, + 0.01817307434976101, + 0.019147656857967377, + 0.020234832540154457, + 0.0213837381452322, + 0.0225636325776577, + 0.023797322064638138, + 0.025098465383052826, + 0.026007574051618576, + 0.02686629444360733, + 0.027753368020057678, + 0.02919616922736168, + 0.030760208144783974, + 0.032408032566308975, + 0.03392992913722992, + 0.03551875054836273, + 0.037176139652729034, + 0.038611505180597305, + 0.0401022844016552, + 0.04164952039718628, + 0.04323083162307739, + 0.044872183352708817, + 0.04660448059439659, + 0.04898080229759216, + 0.051478296518325806, + 0.0540926419198513, + 0.05656665191054344, + 0.059153810143470764, + 0.06184477359056473, + 0.0633319690823555, + 0.06485491991043091, + 0.0664144977927208, + 0.06786356121301651, + 0.06933902204036713, + 0.0708465576171875, + 0.07122745364904404, + 0.07148893177509308, + 0.07175137847661972, + 0.0714302808046341, + 0.07098853588104248, + 0.07054952532052994, + 0.0696536973118782, + 0.06860175728797913, + 0.06756570190191269, + 0.06583698838949203, + 0.06372536718845367, + 0.06168146803975105, + 0.06018046289682388, + 0.05921606346964836, + 0.05826711654663086, + 0.057098861783742905, + 0.05550111085176468, + 0.053948063403367996, + 0.052614592015743256, + 0.05217040702700615, + 0.051729973405599594, + 0.05129325017333031, + 0.04880599305033684, + 0.04640785604715347, + 0.04412754997611046, + 0.04252174124121666, + 0.041127435863018036, + 0.03977884724736214, + 0.039236925542354584, + 0.039302412420511246, + 0.03936801478266716, + 0.03879426792263985, + 0.03693365678191185, + 0.03516228497028351, + 0.033528491854667664, + 0.03270527720451355, + 0.03190227597951889, + 0.031118987128138542, + 0.030257539823651314, + 0.02939469926059246, + 0.028556467965245247, + 0.02774215303361416, + 0.026951072737574577, + 0.026182550936937332, + 0.02550608292222023, + 0.02515461854636669, + 0.024807997047901154, + 0.024466153234243393, + 0.023520827293395996, + 0.005027273669838905, + 0.005104724783450365, + 0.0051833693869411945, + 0.005287528038024902, + 0.005399591289460659, + 0.005524246022105217, + 0.00578258465975523, + 0.006053004413843155, + 0.0063130976632237434, + 0.006534609943628311, + 0.006763894110918045, + 0.007016598712652922, + 0.007291444111615419, + 0.007577056530863047, + 0.007883792743086815, + 0.008205950260162354, + 0.008541272953152657, + 0.008822912350296974, + 0.009112215600907803, + 0.009392908774316311, + 0.009587373584508896, + 0.009785863570868969, + 0.010130198672413826, + 0.010785473510622978, + 0.01148313283920288, + 0.012130964547395706, + 0.01271115057170391, + 0.013319084420800209, + 0.013883045874536037, + 0.014425787143409252, + 0.014989746734499931, + 0.01557935494929552, + 0.016193406656384468, + 0.016831660643219948, + 0.017869554460048676, + 0.019039412960410118, + 0.02028585784137249, + 0.021189169958233833, + 0.022107336670160294, + 0.02306431531906128, + 0.024009941145777702, + 0.02499433420598507, + 0.02605133317410946, + 0.027566583827137947, + 0.029169969260692596, + 0.030774300917983055, + 0.03173494711518288, + 0.03272557631134987, + 0.03380683436989784, + 0.03530605137348175, + 0.03687174990773201, + 0.03858451545238495, + 0.040853094309568405, + 0.04325505718588829, + 0.04574161022901535, + 0.04799420014023781, + 0.05035772547125816, + 0.05283554643392563, + 0.05541739612817764, + 0.05812541022896767, + 0.06083454564213753, + 0.06174445524811745, + 0.06266797333955765, + 0.06360767036676407, + 0.06510864943265915, + 0.0666450560092926, + 0.06821770966053009, + 0.06959627568721771, + 0.07098386436700821, + 0.07239912450313568, + 0.07292590290307999, + 0.07326896488666534, + 0.07361365109682083, + 0.07210849225521088, + 0.06993035972118378, + 0.06781802326440811, + 0.06639464199542999, + 0.0654369592666626, + 0.0644930973649025, + 0.0630389153957367, + 0.06096549704670906, + 0.05896027386188507, + 0.05749041214585304, + 0.057304754853248596, + 0.0571197010576725, + 0.05672839656472206, + 0.054236672818660736, + 0.051854390650987625, + 0.04957675561308861, + 0.048780206590890884, + 0.048175349831581116, + 0.04757799953222275, + 0.047610390931367874, + 0.0479593425989151, + 0.04831085726618767, + 0.04755869507789612, + 0.04539556801319122, + 0.043330829590559006, + 0.041556891053915024, + 0.0407869778573513, + 0.04003133252263069, + 0.0392896793782711, + 0.038437630981206894, + 0.03758994862437248, + 0.036760956048965454, + 0.03578585386276245, + 0.03473139926791191, + 0.03370801359415054, + 0.03257497400045395, + 0.031152592971920967, + 0.029792316257953644, + 0.028491437435150146, + 0.027334149926900864, + 0.005281395278871059, + 0.005467388313263655, + 0.005659930873662233, + 0.005728923249989748, + 0.005793009418994188, + 0.00589063111692667, + 0.006107674445956945, + 0.006332714576274157, + 0.006721786223351955, + 0.00732377590611577, + 0.0079796789214015, + 0.008104284293949604, + 0.007994554936885834, + 0.007886311039328575, + 0.008353227749466896, + 0.008898510597646236, + 0.009430978447198868, + 0.009654526598751545, + 0.009883373975753784, + 0.010061458684504032, + 0.010119933634996414, + 0.010178748518228531, + 0.010568855330348015, + 0.01134764775633812, + 0.01218382641673088, + 0.012988518923521042, + 0.013791456818580627, + 0.014644031412899494, + 0.014872937463223934, + 0.014919260516762733, + 0.014965728856623173, + 0.015412233769893646, + 0.015915805473923683, + 0.01643742248415947, + 0.01710958406329155, + 0.01780923269689083, + 0.018530219793319702, + 0.019214585423469543, + 0.0199242252856493, + 0.020679540932178497, + 0.021557532250881195, + 0.0224728025496006, + 0.023547735065221786, + 0.025090515613555908, + 0.026734374463558197, + 0.028267651796340942, + 0.029292786493897438, + 0.030355097725987434, + 0.031228015199303627, + 0.0315876342356205, + 0.03195139393210411, + 0.03260652348399162, + 0.03394109010696411, + 0.035330284386873245, + 0.03658239170908928, + 0.037413351237773895, + 0.03826318681240082, + 0.039270561188459396, + 0.04068379104137421, + 0.04214787855744362, + 0.04348203167319298, + 0.04423465207219124, + 0.04500030353665352, + 0.04588063433766365, + 0.0472860112786293, + 0.04873443767428398, + 0.05026932805776596, + 0.05228002741932869, + 0.05437115952372551, + 0.0565459318459034, + 0.05581638962030411, + 0.055089712142944336, + 0.05437249690294266, + 0.05637234449386597, + 0.058819279074668884, + 0.06137242168188095, + 0.06153577193617821, + 0.060909438878297806, + 0.06028948351740837, + 0.05955900624394417, + 0.05876310169696808, + 0.057977836579084396, + 0.057542912662029266, + 0.057538554072380066, + 0.05753419175744057, + 0.057864706963300705, + 0.059167999774217606, + 0.06050064414739609, + 0.061726849526166916, + 0.06078575551509857, + 0.0598590113222599, + 0.0589464008808136, + 0.060287367552518845, + 0.062106598168611526, + 0.06398073583841324, + 0.06312757730484009, + 0.06053601950407028, + 0.05805084854364395, + 0.056567687541246414, + 0.05681271106004715, + 0.05705878511071205, + 0.05728676915168762, + 0.05727187544107437, + 0.057256992906332016, + 0.05724211037158966, + 0.05550587922334671, + 0.053362566977739334, + 0.05130201578140259, + 0.04925552383065224, + 0.047219809144735336, + 0.0452682264149189, + 0.04340140521526337, + 0.0416356585919857, + 0.005580178461968899, + 0.00557341193780303, + 0.005614354740828276, + 0.005907496903091669, + 0.006215944886207581, + 0.0064653921872377396, + 0.006622706539928913, + 0.006783850025385618, + 0.006954828277230263, + 0.007132958620786667, + 0.007315651047974825, + 0.007602679543197155, + 0.007910479791462421, + 0.008205768652260303, + 0.008349723182618618, + 0.008496204391121864, + 0.008684232831001282, + 0.008954118937253952, + 0.00923239253461361, + 0.009637660346925259, + 0.01017206534743309, + 0.010736102238297462, + 0.011008570902049541, + 0.011149905622005463, + 0.011293054558336735, + 0.011659246869385242, + 0.012075532227754593, + 0.012506681494414806, + 0.01288093626499176, + 0.013266286812722683, + 0.013692246749997139, + 0.014347548596560955, + 0.015034212730824947, + 0.015718599781394005, + 0.01631264202296734, + 0.016929132863879204, + 0.017503470182418823, + 0.017956433817744255, + 0.018421120941638947, + 0.018985258415341377, + 0.01970328576862812, + 0.02044847048819065, + 0.021027807146310806, + 0.02138970047235489, + 0.0217578187584877, + 0.022344114258885384, + 0.023165468126535416, + 0.02401701547205448, + 0.024881571531295776, + 0.025760194286704063, + 0.026669839397072792, + 0.027384096756577492, + 0.027916202321648598, + 0.028458649292588234, + 0.029242997989058495, + 0.030263597145676613, + 0.031319815665483475, + 0.032141394913196564, + 0.03271114453673363, + 0.03329099342226982, + 0.034049972891807556, + 0.03502940386533737, + 0.03603701293468475, + 0.036963704973459244, + 0.037747085094451904, + 0.03854706883430481, + 0.03930066153407097, + 0.039935603737831116, + 0.04058080166578293, + 0.0413370281457901, + 0.04244815185666084, + 0.043589141219854355, + 0.044742874801158905, + 0.04579387977719307, + 0.04686957597732544, + 0.04797053337097168, + 0.04899382218718529, + 0.05003814771771431, + 0.05110473185777664, + 0.053123194724321365, + 0.05539846047759056, + 0.05777117982506752, + 0.05893970653414726, + 0.05952205881476402, + 0.06011016666889191, + 0.061345174908638, + 0.06326469033956528, + 0.06524426490068436, + 0.06666155159473419, + 0.06665196269750595, + 0.0666423812508583, + 0.06669694185256958, + 0.06746169924736023, + 0.06823523342609406, + 0.06901763379573822, + 0.07032907009124756, + 0.07176122814416885, + 0.07322254776954651, + 0.07358246296644211, + 0.07317514717578888, + 0.07277008891105652, + 0.07252128422260284, + 0.07259917259216309, + 0.0726771429181099, + 0.07273423671722412, + 0.07211744785308838, + 0.07150588184595108, + 0.07089950889348984, + 0.06982044875621796, + 0.06857624650001526, + 0.067354217171669, + 0.06562311202287674, + 0.06314413249492645, + 0.005510490387678146, + 0.005644946359097958, + 0.005788489244878292, + 0.00594364432618022, + 0.00610295869410038, + 0.006336015183478594, + 0.00660972623154521, + 0.006895261816680431, + 0.006981194019317627, + 0.00705671077594161, + 0.007161071058362722, + 0.007393292151391506, + 0.0076330434530973434, + 0.007849320769309998, + 0.008025078102946281, + 0.008204772137105465, + 0.008464048616588116, + 0.008781214244663715, + 0.009110265411436558, + 0.009593697264790535, + 0.010139976628124714, + 0.0107173603028059, + 0.010986462235450745, + 0.01125401258468628, + 0.011526062153279781, + 0.011791407130658627, + 0.012062860652804375, + 0.012347875162959099, + 0.01265919953584671, + 0.012978374026715755, + 0.01336248405277729, + 0.013845259323716164, + 0.014345478266477585, + 0.014665880240499973, + 0.014803576283156872, + 0.014942565001547337, + 0.015381456352770329, + 0.016036223620176315, + 0.01671886444091797, + 0.017315605655312538, + 0.01787872426211834, + 0.01846015639603138, + 0.018734624609351158, + 0.01890067383646965, + 0.019068198278546333, + 0.019309042021632195, + 0.019572535529732704, + 0.01983962580561638, + 0.02014162763953209, + 0.020455416291952133, + 0.02077409252524376, + 0.021395834162831306, + 0.022101325914263725, + 0.022830083966255188, + 0.023003078997135162, + 0.02305108681321144, + 0.02309919334948063, + 0.023684222251176834, + 0.02442639134824276, + 0.025191817432641983, + 0.025785846635699272, + 0.026329904794692993, + 0.026885442435741425, + 0.02758101001381874, + 0.028351325541734695, + 0.029143154621124268, + 0.02994633838534355, + 0.030765024945139885, + 0.03160609304904938, + 0.0323648639023304, + 0.03304767981171608, + 0.03374490514397621, + 0.03498802334070206, + 0.03703957796096802, + 0.039211422204971313, + 0.041098736226558685, + 0.04207152500748634, + 0.043067339807748795, + 0.044273342937231064, + 0.0465945228934288, + 0.0490373931825161, + 0.05160834640264511, + 0.05271800979971886, + 0.05383577570319176, + 0.05497724562883377, + 0.05630879104137421, + 0.05771244317293167, + 0.05915107950568199, + 0.06132597103714943, + 0.06404484808444977, + 0.06688427180051804, + 0.06961394846439362, + 0.07208308577537537, + 0.07463981211185455, + 0.07701889425516129, + 0.07805921137332916, + 0.07911359518766403, + 0.08018221706151962, + 0.08364257216453552, + 0.08750168234109879, + 0.09153883904218674, + 0.09255199134349823, + 0.09179304540157318, + 0.09104034304618835, + 0.09117169678211212, + 0.0929575115442276, + 0.09477830678224564, + 0.0964883491396904, + 0.09493402391672134, + 0.09340473264455795, + 0.09190008044242859, + 0.0890606939792633, + 0.08579273521900177, + 0.005790248513221741, + 0.006000183057039976, + 0.006413585506379604, + 0.006926420144736767, + 0.007467860821634531, + 0.007435065694153309, + 0.007402414456009865, + 0.00743345869705081, + 0.007635819260030985, + 0.007843689061701298, + 0.007977907545864582, + 0.008038715459406376, + 0.008099987171590328, + 0.008299591019749641, + 0.00855519250035286, + 0.008818666450679302, + 0.009153186343610287, + 0.009504268877208233, + 0.009858526289463043, + 0.010158435441553593, + 0.010467467829585075, + 0.01074099913239479, + 0.010920743457973003, + 0.01110349502414465, + 0.011386573314666748, + 0.011789458803832531, + 0.012206599116325378, + 0.012791396118700504, + 0.013505028560757637, + 0.014258475042879581, + 0.014355492778122425, + 0.01421890128403902, + 0.01408360805362463, + 0.014602603390812874, + 0.015257911756634712, + 0.01594262756407261, + 0.016019295901060104, + 0.016064099967479706, + 0.0161304771900177, + 0.01690087281167507, + 0.017708061262965202, + 0.018458914011716843, + 0.018302906304597855, + 0.018148217350244522, + 0.018041199073195457, + 0.018222758546471596, + 0.018406139686703682, + 0.018659980967640877, + 0.01926448382437229, + 0.019888564944267273, + 0.020619692280888557, + 0.021789448335766792, + 0.02302556298673153, + 0.02400951460003853, + 0.023529935628175735, + 0.023059936240315437, + 0.0227248165756464, + 0.023076463490724564, + 0.02343355119228363, + 0.023799458518624306, + 0.024196166545152664, + 0.024599486961960793, + 0.02503858134150505, + 0.025933517143130302, + 0.026860440149903297, + 0.027820492163300514, + 0.028058500960469246, + 0.02829092927277088, + 0.028525281697511673, + 0.029578544199466705, + 0.030766122043132782, + 0.03200138360261917, + 0.03278951719403267, + 0.03346541151404381, + 0.034155238419771194, + 0.03537829965353012, + 0.03691510483622551, + 0.03851867467164993, + 0.040040239691734314, + 0.04148025065660477, + 0.042972058057785034, + 0.04467708617448807, + 0.0467388890683651, + 0.048895832151174545, + 0.05104546621441841, + 0.05281004309654236, + 0.05463561788201332, + 0.05652429908514023, + 0.058922577649354935, + 0.06142633035778999, + 0.06403647363185883, + 0.06703697144985199, + 0.07026167213916779, + 0.07364148646593094, + 0.07588137686252594, + 0.077091746032238, + 0.0783214271068573, + 0.07963304221630096, + 0.08111743628978729, + 0.0826295018196106, + 0.08423225581645966, + 0.08813929557800293, + 0.09222754836082458, + 0.09650544822216034, + 0.09926217794418335, + 0.10148565471172333, + 0.10375893861055374, + 0.10609529167413712, + 0.10850036889314651, + 0.1109599620103836, + 0.11270664632320404, + 0.10842656344175339, + 0.10430902987718582, + 0.005020950920879841, + 0.005196218378841877, + 0.005236389115452766, + 0.0052768695168197155, + 0.005405568052083254, + 0.005673564504832029, + 0.005954848136752844, + 0.006147198844701052, + 0.0062915910966694355, + 0.0064393747597932816, + 0.006654353812336922, + 0.006883838213980198, + 0.0071351854130625725, + 0.00749704334884882, + 0.007877252995967865, + 0.008170903660356998, + 0.008262150920927525, + 0.00835441704839468, + 0.008487650193274021, + 0.008659222163259983, + 0.008834262378513813, + 0.009234326891601086, + 0.009749796241521835, + 0.01029404066503048, + 0.010329250246286392, + 0.010286005213856697, + 0.010251144878566265, + 0.010723564773797989, + 0.01121775433421135, + 0.011700049974024296, + 0.011994486674666405, + 0.012296333909034729, + 0.012646702118217945, + 0.013127308338880539, + 0.013626178726553917, + 0.013960621319711208, + 0.013972712680697441, + 0.01398481335490942, + 0.014173933304846287, + 0.014597609639167786, + 0.01503395102918148, + 0.015322358347475529, + 0.015456855297088623, + 0.01559253130108118, + 0.015952207148075104, + 0.01650680974125862, + 0.01708069257438183, + 0.017397742718458176, + 0.01752309314906597, + 0.017649348825216293, + 0.017914921045303345, + 0.018278876319527626, + 0.018650226294994354, + 0.019039344042539597, + 0.01944359950721264, + 0.019856439903378487, + 0.02006208524107933, + 0.020112764090299606, + 0.02016356959939003, + 0.020595110952854156, + 0.021368205547332764, + 0.02217031829059124, + 0.022754404693841934, + 0.023092295974493027, + 0.023435205221176147, + 0.02385607734322548, + 0.024387115612626076, + 0.024929972365498543, + 0.025544442236423492, + 0.02629661001265049, + 0.027070922777056694, + 0.02791505493223667, + 0.02894999086856842, + 0.030023299157619476, + 0.031109163537621498, + 0.03199726343154907, + 0.03291071951389313, + 0.033850256353616714, + 0.03519701212644577, + 0.03661130368709564, + 0.03808242455124855, + 0.040462084114551544, + 0.04320698603987694, + 0.04613809287548065, + 0.04831840097904205, + 0.05003424733877182, + 0.05181103199720383, + 0.05434508994221687, + 0.057944029569625854, + 0.06178129464387894, + 0.0652882531285286, + 0.0669492557644844, + 0.06865250319242477, + 0.07039909064769745, + 0.07304156571626663, + 0.07578403502702713, + 0.07862947136163712, + 0.0826711505651474, + 0.08730270713567734, + 0.09219372272491455, + 0.0970822274684906, + 0.10192232578992844, + 0.10700375586748123, + 0.11196029931306839, + 0.11558898538351059, + 0.11933526396751404, + 0.12320297956466675, + 0.12420627474784851, + 0.12488149106502533, + 0.12556037306785583, + 0.12607982754707336, + 0.12648142874240875, + 0.1268843114376068, + 0.004436806309968233, + 0.0046201893128454685, + 0.004740690812468529, + 0.004864334594458342, + 0.00503145344555378, + 0.005212088581174612, + 0.00538844708353281, + 0.005473966710269451, + 0.005560843273997307, + 0.005708899348974228, + 0.005978920962661505, + 0.006261714268475771, + 0.006460160482674837, + 0.006590895354747772, + 0.006724276579916477, + 0.006931405980139971, + 0.007165012881159782, + 0.007406492717564106, + 0.007505613379180431, + 0.007603347767144442, + 0.007749534212052822, + 0.008149993605911732, + 0.008571147918701172, + 0.008912170305848122, + 0.009053345769643784, + 0.009196757338941097, + 0.009484251961112022, + 0.009943758137524128, + 0.010425527580082417, + 0.010673124343156815, + 0.010761063545942307, + 0.01084972731769085, + 0.011305748485028744, + 0.0119282566010952, + 0.012585042044520378, + 0.01311740092933178, + 0.013637424446642399, + 0.014178063720464706, + 0.014140745624899864, + 0.01404617540538311, + 0.013952239416539669, + 0.01409852970391512, + 0.014251787215471268, + 0.014411021955311298, + 0.014717035926878452, + 0.015029548667371273, + 0.015362067148089409, + 0.01590416021645069, + 0.016465380787849426, + 0.016981491819024086, + 0.01677606999874115, + 0.016573134809732437, + 0.01640934869647026, + 0.01665768399834633, + 0.016909776255488396, + 0.01718858629465103, + 0.017802903428673744, + 0.01843917928636074, + 0.01908491738140583, + 0.019358789548277855, + 0.019636591896414757, + 0.019918380305171013, + 0.020466985180974007, + 0.02103533037006855, + 0.021619455888867378, + 0.021449174731969833, + 0.021211426705121994, + 0.020976316183805466, + 0.02154446952044964, + 0.022298656404018402, + 0.023079244419932365, + 0.0240971390157938, + 0.02524176426231861, + 0.026440758258104324, + 0.02742781862616539, + 0.028274744749069214, + 0.02914782240986824, + 0.030276305973529816, + 0.03171514719724655, + 0.033222366124391556, + 0.03477632999420166, + 0.03634724020957947, + 0.03798910602927208, + 0.03978626802563667, + 0.04217055067420006, + 0.04469772055745125, + 0.04737633839249611, + 0.04869457334280014, + 0.04997735843062401, + 0.05129393935203552, + 0.054332029074430466, + 0.05816885456442833, + 0.062276631593704224, + 0.06585254520177841, + 0.06884188205003738, + 0.07196692377328873, + 0.07515764236450195, + 0.07828111201524734, + 0.08153439313173294, + 0.08496107161045074, + 0.09168920665979385, + 0.09895014762878418, + 0.1067860797047615, + 0.11547116935253143, + 0.12495358288288116, + 0.1352146863937378, + 0.14448213577270508, + 0.15183694660663605, + 0.15956614911556244, + 0.16678133606910706, + 0.16705280542373657, + 0.1673247218132019, + 0.16759707033634186, + 0.014215185306966305, + 0.014411541633307934, + 0.014499826356768608, + 0.01461472362279892, + 0.015257644467055798, + 0.0159288477152586, + 0.01658329926431179, + 0.01715708337724209, + 0.01775072142481804, + 0.01783871091902256, + 0.017510799691081047, + 0.017188919708132744, + 0.017889242619276047, + 0.018924040719866753, + 0.020018694922327995, + 0.020154234021902084, + 0.020286161452531815, + 0.02048398181796074, + 0.020960118621587753, + 0.02144732140004635, + 0.022004608064889908, + 0.022677134722471237, + 0.02337021753191948, + 0.023850804194808006, + 0.024140924215316772, + 0.02443457394838333, + 0.02529176138341427, + 0.02644204907119274, + 0.027644652873277664, + 0.027338780462741852, + 0.02672002650797367, + 0.026115279644727707, + 0.026210742071270943, + 0.026348669081926346, + 0.026544516906142235, + 0.028002003207802773, + 0.02953951433300972, + 0.031063640490174294, + 0.031986333429813385, + 0.03293643146753311, + 0.03375738486647606, + 0.03395652770996094, + 0.03415684774518013, + 0.03423188626766205, + 0.03393201902508736, + 0.03363477811217308, + 0.033916156738996506, + 0.03568801283836365, + 0.03755244240164757, + 0.03879354149103165, + 0.03843551501631737, + 0.038080792874097824, + 0.038111165165901184, + 0.03901439905166626, + 0.039939042180776596, + 0.04056265950202942, + 0.040416162461042404, + 0.04027019441127777, + 0.04012514278292656, + 0.039981722831726074, + 0.039838820695877075, + 0.03984660655260086, + 0.04041533172130585, + 0.040992166846990585, + 0.041563279926776886, + 0.04206015542149544, + 0.042562972754240036, + 0.04302181676030159, + 0.04274642840027809, + 0.042472805827856064, + 0.04220093414187431, + 0.04291696101427078, + 0.04368440434336662, + 0.044465571641922, + 0.04518181085586548, + 0.04589485004544258, + 0.04661914333701134, + 0.04715581610798836, + 0.04761621728539467, + 0.04808111488819122, + 0.04878959804773331, + 0.04970349743962288, + 0.05063451826572418, + 0.051106251776218414, + 0.05082068592309952, + 0.05053671449422836, + 0.050439827144145966, + 0.0511135533452034, + 0.05179627239704132, + 0.05248811095952988, + 0.051020801067352295, + 0.0495697446167469, + 0.04815995693206787, + 0.047699302434921265, + 0.04752623289823532, + 0.04735378548502922, + 0.04677797481417656, + 0.04584341496229172, + 0.04492752626538277, + 0.04423056170344353, + 0.04411701485514641, + 0.04400376230478287, + 0.04389079660177231, + 0.04397785663604736, + 0.0440695621073246, + 0.04416145756840706, + 0.043371621519327164, + 0.042193811386823654, + 0.04104798659682274, + 0.04000604525208473, + 0.03911549970507622, + 0.03824478015303612, + 0.03738340735435486, + 0.0134893162176013, + 0.013764336705207825, + 0.014353085309267044, + 0.014967016875743866, + 0.015394181944429874, + 0.015694202855229378, + 0.016000069677829742, + 0.016331156715750694, + 0.016672132536768913, + 0.017031891271471977, + 0.017497850582003593, + 0.017976557835936546, + 0.01850920356810093, + 0.019141443073749542, + 0.019795279949903488, + 0.02023276872932911, + 0.020479053258895874, + 0.02072833478450775, + 0.021157046779990196, + 0.021657919511198997, + 0.022170649841427803, + 0.022710084915161133, + 0.02326393686234951, + 0.023817462846636772, + 0.024229878559708595, + 0.02464943751692772, + 0.025091225281357765, + 0.025591619312763214, + 0.026101989671587944, + 0.02657848224043846, + 0.02698505111038685, + 0.02739783562719822, + 0.02798195742070675, + 0.02876374125480652, + 0.02956736832857132, + 0.030034955590963364, + 0.030245646834373474, + 0.030457815155386925, + 0.030750855803489685, + 0.03108816407620907, + 0.031429171562194824, + 0.032351166009902954, + 0.03352751582860947, + 0.03474663943052292, + 0.03505314141511917, + 0.03508758917450905, + 0.03512207418680191, + 0.035374075174331665, + 0.035679999738931656, + 0.03598857671022415, + 0.03628718480467796, + 0.036585573107004166, + 0.036886412650346756, + 0.037270575761795044, + 0.03767620027065277, + 0.03808623552322388, + 0.03912115842103958, + 0.04033845663070679, + 0.041593629866838455, + 0.04203487187623978, + 0.04222977161407471, + 0.04242558032274246, + 0.042985014617443085, + 0.04369513317942619, + 0.04441698640584946, + 0.04460671916604042, + 0.0445081889629364, + 0.04440987482666969, + 0.044558119028806686, + 0.044897474348545074, + 0.0452394112944603, + 0.04597657173871994, + 0.047194138169288635, + 0.048443954437971115, + 0.049352653324604034, + 0.04955080896615982, + 0.04974975809454918, + 0.049923501908779144, + 0.04999536648392677, + 0.05006733164191246, + 0.05017402768135071, + 0.05099749565124512, + 0.051834482699632645, + 0.0526852011680603, + 0.05178244039416313, + 0.05064605176448822, + 0.049534596502780914, + 0.049415670335292816, + 0.049757059663534164, + 0.05010081082582474, + 0.049845140427351, + 0.048925597220659256, + 0.04802301898598671, + 0.047202568501234055, + 0.046597760170698166, + 0.04600070044398308, + 0.04541128873825073, + 0.04466849938035011, + 0.043937262147665024, + 0.04321800172328949, + 0.0426643081009388, + 0.04217350855469704, + 0.041688352823257446, + 0.04118781536817551, + 0.04066786542534828, + 0.04015447944402695, + 0.03962305933237076, + 0.03895903378725052, + 0.038306135684251785, + 0.037664178758859634, + 0.03676928952336311, + 0.03584214672446251, + 0.03493838012218475, + 0.014555768109858036, + 0.015188637189567089, + 0.015296871773898602, + 0.015380583703517914, + 0.015494082123041153, + 0.015709728002548218, + 0.015928376466035843, + 0.016243593767285347, + 0.01666819304227829, + 0.0171038918197155, + 0.017614146694540977, + 0.018164750188589096, + 0.01873256266117096, + 0.019245194271206856, + 0.019767606630921364, + 0.020314352586865425, + 0.02093319594860077, + 0.02157089114189148, + 0.022102726623415947, + 0.022409100085496902, + 0.022719724103808403, + 0.023227963596582413, + 0.023927699774503708, + 0.0246485136449337, + 0.025220420211553574, + 0.02572622150182724, + 0.026242168620228767, + 0.026653500273823738, + 0.02704770863056183, + 0.027447747066617012, + 0.027896186336874962, + 0.02835371159017086, + 0.028883136808872223, + 0.03025824949145317, + 0.03169882670044899, + 0.03304875269532204, + 0.033659737557172775, + 0.03428201749920845, + 0.034565720707178116, + 0.03381839022040367, + 0.033087216317653656, + 0.032802436500787735, + 0.033469345420598984, + 0.034149814397096634, + 0.03480934351682663, + 0.035419244319200516, + 0.03603983297944069, + 0.03642409294843674, + 0.036429379135370255, + 0.036434661597013474, + 0.03651390224695206, + 0.03670173138380051, + 0.036890529096126556, + 0.037206415086984634, + 0.0377136692404747, + 0.038227833807468414, + 0.03891655430197716, + 0.039892956614494324, + 0.04089385271072388, + 0.041964877396821976, + 0.04315099120140076, + 0.0443706288933754, + 0.04547632858157158, + 0.04624473676085472, + 0.0470261313021183, + 0.047410596162080765, + 0.046376269310712814, + 0.04536450654268265, + 0.0445573627948761, + 0.04494738206267357, + 0.04534082114696503, + 0.04575236514210701, + 0.04669424146413803, + 0.047655511647462845, + 0.04863656684756279, + 0.04775147885084152, + 0.04669012501835823, + 0.0456523597240448, + 0.04580175504088402, + 0.04632050171494484, + 0.046845123171806335, + 0.04708344116806984, + 0.047131624072790146, + 0.04717985540628433, + 0.04730164632201195, + 0.04752252623438835, + 0.04774443805217743, + 0.0479615293443203, + 0.048160284757614136, + 0.048359863460063934, + 0.04854808375239372, + 0.04816454276442528, + 0.04778403043746948, + 0.047406524419784546, + 0.04660971835255623, + 0.04571670666337013, + 0.04484080523252487, + 0.044271163642406464, + 0.04395227134227753, + 0.04363568127155304, + 0.04310150817036629, + 0.042004793882369995, + 0.04093598946928978, + 0.039894379675388336, + 0.039474766701459885, + 0.03906627371907234, + 0.03866200149059296, + 0.038145724684000015, + 0.03758369758725166, + 0.03702995181083679, + 0.03674280643463135, + 0.03691406175494194, + 0.037086114287376404, + 0.013594762422144413, + 0.01399310864508152, + 0.014493241906166077, + 0.015065505169332027, + 0.015660366043448448, + 0.01611175760626793, + 0.016557712107896805, + 0.017006106674671173, + 0.01741178333759308, + 0.017827138304710388, + 0.01833501271903515, + 0.018988674506545067, + 0.019665639847517014, + 0.020100759342312813, + 0.0203783567994833, + 0.020659789443016052, + 0.021551955491304398, + 0.022620582953095436, + 0.023724265396595, + 0.02365841716527939, + 0.02359275333583355, + 0.02359357476234436, + 0.02387908846139908, + 0.02416805736720562, + 0.02452709712088108, + 0.025017764419317245, + 0.025518251582980156, + 0.02615630254149437, + 0.026945551857352257, + 0.02775861695408821, + 0.028486080467700958, + 0.02916356734931469, + 0.02985716424882412, + 0.030360331758856773, + 0.030794929713010788, + 0.031235750764608383, + 0.0316813625395298, + 0.03213300555944443, + 0.0325910858809948, + 0.03347314894199371, + 0.03442481532692909, + 0.0354035422205925, + 0.03594622388482094, + 0.03648083284497261, + 0.03703639656305313, + 0.03874891996383667, + 0.040540628135204315, + 0.042350780218839645, + 0.04266449064016342, + 0.04298052191734314, + 0.043264515697956085, + 0.04292597994208336, + 0.04259008914232254, + 0.0422520712018013, + 0.041821710765361786, + 0.04139573127031326, + 0.04099246859550476, + 0.04129786416888237, + 0.04160552844405174, + 0.04191548749804497, + 0.04252566024661064, + 0.04314886033535004, + 0.04378119111061096, + 0.04406643286347389, + 0.04432687163352966, + 0.044588852673769, + 0.044353075325489044, + 0.04403642192482948, + 0.04372202977538109, + 0.043454501777887344, + 0.04320210590958595, + 0.042951181530952454, + 0.04376767575740814, + 0.04517296329140663, + 0.04662337899208069, + 0.047104641795158386, + 0.04671043902635574, + 0.04631953313946724, + 0.04614556208252907, + 0.04630697891116142, + 0.04646895453333855, + 0.04663219675421715, + 0.046798352152109146, + 0.0469650961458683, + 0.04708251729607582, + 0.04627183452248573, + 0.04547511413693428, + 0.044692106544971466, + 0.04430698975920677, + 0.043990641832351685, + 0.04367654770612717, + 0.0440988652408123, + 0.044948793947696686, + 0.045815106481313705, + 0.04624199494719505, + 0.04600931704044342, + 0.045777805149555206, + 0.04535060003399849, + 0.043884873390197754, + 0.04246651753783226, + 0.04109400138258934, + 0.04065681993961334, + 0.04033857583999634, + 0.04002281650900841, + 0.03919527307152748, + 0.03805103898048401, + 0.03694021329283714, + 0.036147747188806534, + 0.03605810925364494, + 0.03596869111061096, + 0.03587949648499489, + 0.035073649138212204, + 0.03426271677017212, + 0.014057411812245846, + 0.014093523845076561, + 0.01436159573495388, + 0.015047031454741955, + 0.015765180811285973, + 0.01606893353164196, + 0.016123438253998756, + 0.016178127378225327, + 0.016787586733698845, + 0.017493195831775665, + 0.01818460412323475, + 0.01858910173177719, + 0.01900259591639042, + 0.01957894116640091, + 0.020474551245570183, + 0.02141113020479679, + 0.02227224037051201, + 0.023068588227033615, + 0.023893408477306366, + 0.024040525779128075, + 0.023945454508066177, + 0.023850759491324425, + 0.02467982843518257, + 0.025627922266721725, + 0.026538945734500885, + 0.02653631940484047, + 0.026533691212534904, + 0.026721704751253128, + 0.02762388437986374, + 0.028556523844599724, + 0.029521357268095016, + 0.030520206317305565, + 0.03155285120010376, + 0.03206733986735344, + 0.03191647306084633, + 0.03176631033420563, + 0.03226480260491371, + 0.03333473205566406, + 0.034440141171216965, + 0.03514315187931061, + 0.035588763654232025, + 0.03604003041982651, + 0.0363127700984478, + 0.0365007109940052, + 0.036689624190330505, + 0.03759010136127472, + 0.038793597370386124, + 0.04003561660647392, + 0.040652208030223846, + 0.041057027876377106, + 0.0414658822119236, + 0.042358387261629105, + 0.04342462867498398, + 0.04451770707964897, + 0.04450694099068642, + 0.04413524270057678, + 0.043766651302576065, + 0.043956611305475235, + 0.0443539172410965, + 0.044754814356565475, + 0.04540958255529404, + 0.046187933534383774, + 0.046979621052742004, + 0.047617241740226746, + 0.04816542565822601, + 0.048719920217990875, + 0.04799235984683037, + 0.046295732259750366, + 0.0446590818464756, + 0.04401545226573944, + 0.04446098208427429, + 0.04491101950407028, + 0.045396577566862106, + 0.04594393074512482, + 0.0464978888630867, + 0.04675177484750748, + 0.0459851510822773, + 0.04523109644651413, + 0.04453572258353233, + 0.04434821009635925, + 0.044161487370729446, + 0.04397555813193321, + 0.04392575845122337, + 0.04388747736811638, + 0.04384923726320267, + 0.043963633477687836, + 0.044131796807050705, + 0.04430059716105461, + 0.044619858264923096, + 0.04506870359182358, + 0.0455220565199852, + 0.04572908580303192, + 0.045422278344631195, + 0.04511752724647522, + 0.044700708240270615, + 0.043191470205783844, + 0.04173319414258003, + 0.04032415151596069, + 0.03950117528438568, + 0.03879658505320549, + 0.03810456022620201, + 0.03768658638000488, + 0.037470802664756775, + 0.037256255745887756, + 0.03686843067407608, + 0.03604229539632797, + 0.03523466736078262, + 0.0344451405107975, + 0.0345335491001606, + 0.03464822471141815, + 0.03476328402757645, + 0.03463084250688553, + 0.03436335176229477, + 0.013505718670785427, + 0.013714058324694633, + 0.014006571844220161, + 0.01473518367856741, + 0.015501697547733784, + 0.01606081984937191, + 0.016306590288877487, + 0.016556119546294212, + 0.01709505170583725, + 0.01779136434197426, + 0.018516039475798607, + 0.018999995663762093, + 0.019471513107419014, + 0.01989596150815487, + 0.01995314657688141, + 0.02001049555838108, + 0.020386191084980965, + 0.021411625668406487, + 0.022488638758659363, + 0.023464471101760864, + 0.024339135736227036, + 0.025246405974030495, + 0.025939982384443283, + 0.026545081287622452, + 0.027164291590452194, + 0.027360478416085243, + 0.027485832571983337, + 0.027611762285232544, + 0.028548387810587883, + 0.029517963528633118, + 0.03048856370151043, + 0.031257305294275284, + 0.032045427709817886, + 0.03277130797505379, + 0.03323609381914139, + 0.03370746597647667, + 0.034205079078674316, + 0.03475160524249077, + 0.035306867212057114, + 0.035842087119817734, + 0.03634122759103775, + 0.0368473157286644, + 0.03777638077735901, + 0.03923984616994858, + 0.04076000303030014, + 0.04200757294893265, + 0.042954932898283005, + 0.04392365738749504, + 0.044391319155693054, + 0.044393330812454224, + 0.04439534246921539, + 0.04470843821763992, + 0.04529754817485809, + 0.04589441791176796, + 0.04610192030668259, + 0.04595571011304855, + 0.04580996558070183, + 0.045613233000040054, + 0.045366715639829636, + 0.045121531933546066, + 0.045026008039712906, + 0.0451044887304306, + 0.04518311098217964, + 0.0452565997838974, + 0.04532233998179436, + 0.045388173311948776, + 0.04549604654312134, + 0.04569132626056671, + 0.04588744416832924, + 0.046000029891729355, + 0.045834168791770935, + 0.04566890373826027, + 0.04560275748372078, + 0.046256981790065765, + 0.046920593827962875, + 0.04759372025728226, + 0.04758555069565773, + 0.04757225140929222, + 0.04755895957350731, + 0.046642325818538666, + 0.04558442533016205, + 0.04455051198601723, + 0.04487278684973717, + 0.04583573341369629, + 0.04681934416294098, + 0.046291641891002655, + 0.04430774226784706, + 0.042408864945173264, + 0.041017089039087296, + 0.04064342752099037, + 0.04027317464351654, + 0.03994176164269447, + 0.04000212624669075, + 0.04006258025765419, + 0.04012312367558479, + 0.03964629024267197, + 0.03908029571175575, + 0.0385223813354969, + 0.037938933819532394, + 0.03734173998236656, + 0.03675394132733345, + 0.03614988923072815, + 0.035502735525369644, + 0.034867167472839355, + 0.03426125645637512, + 0.034250788390636444, + 0.03424032777547836, + 0.03422987088561058, + 0.03347882255911827, + 0.03246767446398735, + 0.03148706257343292, + 0.030799569562077522, + 0.030530428513884544, + 0.011491579934954643, + 0.01195079367607832, + 0.012426676228642464, + 0.012818790972232819, + 0.01322328019887209, + 0.013633890077471733, + 0.014039846137166023, + 0.014457888901233673, + 0.014867397956550121, + 0.0152695681899786, + 0.01568261906504631, + 0.016402503475546837, + 0.01725056581199169, + 0.018142476677894592, + 0.01839926838874817, + 0.018649958074092865, + 0.018962636590003967, + 0.019537942484021187, + 0.0201307013630867, + 0.020841609686613083, + 0.021750295534729958, + 0.022698599845170975, + 0.023526858538389206, + 0.024248449131846428, + 0.024992169812321663, + 0.02582523599267006, + 0.026715008541941643, + 0.02763543650507927, + 0.028464334085583687, + 0.02929466776549816, + 0.030149223282933235, + 0.031484585255384445, + 0.03289520740509033, + 0.03429480269551277, + 0.03481106087565422, + 0.03533509001135826, + 0.03579114377498627, + 0.03586919233202934, + 0.035947415977716446, + 0.036262352019548416, + 0.03734365850687027, + 0.03845721110701561, + 0.03965681791305542, + 0.041022032499313354, + 0.042434245347976685, + 0.0440201498568058, + 0.04591779783368111, + 0.047897253185510635, + 0.04889385774731636, + 0.048071376979351044, + 0.047262728214263916, + 0.04718795046210289, + 0.0483451746404171, + 0.04953078553080559, + 0.04988272488117218, + 0.04875853285193443, + 0.04765967279672623, + 0.04709687829017639, + 0.047541964799165726, + 0.047991249710321426, + 0.04820521920919418, + 0.0478532500565052, + 0.04750384762883186, + 0.04723985120654106, + 0.04724450781941414, + 0.047249168157577515, + 0.04753973335027695, + 0.04938013479113579, + 0.051291778683662415, + 0.05307683348655701, + 0.052010372281074524, + 0.050965338945388794, + 0.049941301345825195, + 0.04921779781579971, + 0.04851849004626274, + 0.04782911390066147, + 0.047307152301073074, + 0.04682442173361778, + 0.04634661599993706, + 0.04566264897584915, + 0.04488953575491905, + 0.04412951320409775, + 0.04330312833189964, + 0.04241805151104927, + 0.04155106097459793, + 0.041120804846286774, + 0.04155554994940758, + 0.04199489206075668, + 0.04236195236444473, + 0.042207177728414536, + 0.042052965611219406, + 0.041899316012859344, + 0.04098347947001457, + 0.04001391679048538, + 0.03906729817390442, + 0.038158368319272995, + 0.03727786988019943, + 0.036417681723833084, + 0.03552596643567085, + 0.03458622843027115, + 0.03367134556174278, + 0.03284507989883423, + 0.032415542751550674, + 0.0319916270673275, + 0.03157325088977814, + 0.03125670924782753, + 0.030959947034716606, + 0.03066600114107132, + 0.030500950291752815, + 0.03044337034225464, + 0.030385900288820267, + 0.03025190532207489, + 0.02983728051185608, + 0.009946242906153202, + 0.010314426384866238, + 0.010696237906813622, + 0.011100337840616703, + 0.011520357802510262, + 0.01194063387811184, + 0.012308859266340733, + 0.012688440270721912, + 0.013240618631243706, + 0.01403090450912714, + 0.014868360012769699, + 0.015306146815419197, + 0.015540694817900658, + 0.015778835862874985, + 0.016186794266104698, + 0.01662530191242695, + 0.01707540452480316, + 0.01753498613834381, + 0.018006939440965652, + 0.018582243472337723, + 0.019412195309996605, + 0.020279213786125183, + 0.021095406264066696, + 0.021834077313542366, + 0.022598613053560257, + 0.023592805489897728, + 0.024766096845269203, + 0.025997735559940338, + 0.026670150458812714, + 0.027152108028531075, + 0.027642779052257538, + 0.028786376118659973, + 0.030075160786509514, + 0.03142164275050163, + 0.03229222074151039, + 0.033176276832818985, + 0.03408262878656387, + 0.03498836234211922, + 0.03591816872358322, + 0.03693455457687378, + 0.03835536167025566, + 0.039830826222896576, + 0.0412343367934227, + 0.042168863117694855, + 0.043124567717313766, + 0.04409657418727875, + 0.04507353529334068, + 0.046072136610746384, + 0.04691950976848602, + 0.047305066138505936, + 0.04769379645586014, + 0.04822544381022453, + 0.04913516715168953, + 0.05006204918026924, + 0.050881288945674896, + 0.05136628821492195, + 0.051855914294719696, + 0.05198527127504349, + 0.05097758397459984, + 0.04998943209648132, + 0.049457330256700516, + 0.050728198140859604, + 0.05203172564506531, + 0.05314714089035988, + 0.05288176238536835, + 0.05261770635843277, + 0.05235986411571503, + 0.05218059942126274, + 0.0520019493997097, + 0.05182391032576561, + 0.052582696080207825, + 0.05338817462325096, + 0.054205987602472305, + 0.053289953619241714, + 0.052096109837293625, + 0.050929006189107895, + 0.04903574287891388, + 0.04693640023469925, + 0.04492694512009621, + 0.043981026858091354, + 0.04377937689423561, + 0.043578654527664185, + 0.04356199875473976, + 0.04381178691983223, + 0.044063009321689606, + 0.04411155357956886, + 0.04346444085240364, + 0.0428268238902092, + 0.042195722460746765, + 0.04146060720086098, + 0.0407382994890213, + 0.04002857580780983, + 0.03908004239201546, + 0.03809470310807228, + 0.03713420405983925, + 0.037034425884485245, + 0.037584301084280014, + 0.03814234212040901, + 0.03790009021759033, + 0.035943206399679184, + 0.03408735617995262, + 0.032372135668992996, + 0.031853921711444855, + 0.03134399652481079, + 0.030842235311865807, + 0.031070353463292122, + 0.03155292943120003, + 0.03204300254583359, + 0.03191673010587692, + 0.03099840320646763, + 0.030106499791145325, + 0.02921527810394764, + 0.02814306877553463, + 0.010501734912395477, + 0.01064453087747097, + 0.010789269581437111, + 0.01122334599494934, + 0.011708998121321201, + 0.012197187170386314, + 0.012607871554791927, + 0.013032384216785431, + 0.013473822735249996, + 0.013934084214270115, + 0.014410069212317467, + 0.014842440374195576, + 0.015254255384206772, + 0.015677496790885925, + 0.01616300642490387, + 0.016671668738126755, + 0.0171812791377306, + 0.01749524101614952, + 0.017814941704273224, + 0.018267320469021797, + 0.01911654695868492, + 0.020005254074931145, + 0.021007830277085304, + 0.022163761779665947, + 0.023383300751447678, + 0.024503657594323158, + 0.025552747771143913, + 0.026646750047802925, + 0.027099210768938065, + 0.027291826903820038, + 0.027485812082886696, + 0.02819935791194439, + 0.029031584039330482, + 0.029888369143009186, + 0.030769841745495796, + 0.031677279621362686, + 0.03263041749596596, + 0.03408493474125862, + 0.035604286938905716, + 0.03710947930812836, + 0.0380205363035202, + 0.038953959941864014, + 0.03997306525707245, + 0.041331734508275986, + 0.04273658245801926, + 0.04398494213819504, + 0.04449814185500145, + 0.04501732438802719, + 0.045524585992097855, + 0.04597888141870499, + 0.04643770679831505, + 0.04671771451830864, + 0.04643178731203079, + 0.046147603541612625, + 0.046071987599134445, + 0.04667757451534271, + 0.047291118651628494, + 0.04781932011246681, + 0.047995347529649734, + 0.04817201942205429, + 0.048664554953575134, + 0.05081227794289589, + 0.05305478349328041, + 0.05492490902543068, + 0.052818454802036285, + 0.05079278722405434, + 0.048898205161094666, + 0.04904427379369736, + 0.04919077828526497, + 0.0493377186357975, + 0.048962365835905075, + 0.04855145886540413, + 0.04814400151371956, + 0.04791741445660591, + 0.047731272876262665, + 0.04754585772752762, + 0.047177352011203766, + 0.046729132533073425, + 0.046285174787044525, + 0.046282146126031876, + 0.04665457084774971, + 0.047029998153448105, + 0.04693407192826271, + 0.046057384461164474, + 0.04519706964492798, + 0.0443442203104496, + 0.04347166791558266, + 0.042616285383701324, + 0.04177773371338844, + 0.04141797870397568, + 0.041066281497478485, + 0.04071756824851036, + 0.04119962453842163, + 0.04194115102291107, + 0.0426960252225399, + 0.042515549808740616, + 0.041522279381752014, + 0.04055221006274223, + 0.03971286863088608, + 0.03916938975453377, + 0.038633354008197784, + 0.03810448572039604, + 0.03750580549240112, + 0.03691653162240982, + 0.036336515098810196, + 0.035346027463674545, + 0.0342167392373085, + 0.03312353417277336, + 0.03235544264316559, + 0.03203847259283066, + 0.031724609434604645, + 0.031367506831884384, + 0.030395731329917908, + 0.00947450939565897, + 0.009812092408537865, + 0.010161704383790493, + 0.010424014180898666, + 0.01068523433059454, + 0.010967131704092026, + 0.011317170225083828, + 0.011678380891680717, + 0.011943447403609753, + 0.012077445164322853, + 0.012212944217026234, + 0.012541607022285461, + 0.01297406293451786, + 0.013421433046460152, + 0.013898145407438278, + 0.014393473975360394, + 0.014926407486200333, + 0.015670085325837135, + 0.01645081490278244, + 0.01707485504448414, + 0.017224250361323357, + 0.017374955117702484, + 0.017679501324892044, + 0.018175886943936348, + 0.018686208873987198, + 0.01926957629621029, + 0.019909678027033806, + 0.020571041852235794, + 0.021524647250771523, + 0.02261701598763466, + 0.023764826357364655, + 0.024485573172569275, + 0.025156952440738678, + 0.02584673836827278, + 0.02627820149064064, + 0.02671140432357788, + 0.027189377695322037, + 0.028178740292787552, + 0.029204102233052254, + 0.030229223892092705, + 0.031063109636306763, + 0.031919997185468674, + 0.03279625251889229, + 0.03367936983704567, + 0.03458626568317413, + 0.03550242260098457, + 0.036394763737916946, + 0.03730953112244606, + 0.03819543495774269, + 0.03895818069577217, + 0.03973616287112236, + 0.04046500846743584, + 0.041035156697034836, + 0.04161334037780762, + 0.042303577065467834, + 0.0432966873049736, + 0.044313110411167145, + 0.045240506529808044, + 0.045825641602277756, + 0.04641834646463394, + 0.047065939754247665, + 0.04791775345802307, + 0.04878498613834381, + 0.04983387514948845, + 0.05198654904961586, + 0.054232217371463776, + 0.056293558329343796, + 0.05398932099342346, + 0.05177939683198929, + 0.04965993016958237, + 0.05003029853105545, + 0.050495583564043045, + 0.05096519738435745, + 0.05061038210988045, + 0.05011610686779022, + 0.049626655876636505, + 0.049737658351659775, + 0.05008111521601677, + 0.05042693763971329, + 0.05020621791481972, + 0.049570102244615555, + 0.048942048102617264, + 0.04881893843412399, + 0.04942290484905243, + 0.05003434419631958, + 0.05053054168820381, + 0.050607334822416306, + 0.05068425089120865, + 0.0507446750998497, + 0.05013420805335045, + 0.04953109100461006, + 0.04893522337079048, + 0.04871698096394539, + 0.04858964681625366, + 0.0484626479446888, + 0.04825122281908989, + 0.04797644168138504, + 0.04770321771502495, + 0.04737001284956932, + 0.04690439999103546, + 0.046443358063697815, + 0.045956846326589584, + 0.04472113773226738, + 0.04351864755153656, + 0.04234849289059639, + 0.0416240356862545, + 0.04105222225189209, + 0.040488261729478836, + 0.03965727984905243, + 0.038495197892189026, + 0.037367165088653564, + 0.036366019397974014, + 0.0361858569085598, + 0.006610750220716, + 0.0068294755183160305, + 0.007054639048874378, + 0.007238675840198994, + 0.007427513599395752, + 0.0076221441850066185, + 0.00782413873821497, + 0.008031485602259636, + 0.008359338156878948, + 0.00880714412778616, + 0.009278938174247742, + 0.009493590332567692, + 0.009627026505768299, + 0.009762338362634182, + 0.01014640461653471, + 0.010549310594797134, + 0.010935522615909576, + 0.011191753670573235, + 0.011453989893198013, + 0.011746466159820557, + 0.012087405659258366, + 0.012438240461051464, + 0.012775884941220284, + 0.013102960772812366, + 0.013438410125672817, + 0.013910644687712193, + 0.014455597847700119, + 0.015021898783743382, + 0.015741689130663872, + 0.016521548852324486, + 0.017340045422315598, + 0.017689252272248268, + 0.018028276041150093, + 0.01840473711490631, + 0.019183924421668053, + 0.019996099174022675, + 0.020814457908272743, + 0.021519334986805916, + 0.022248083725571632, + 0.0230140071362257, + 0.023847142234444618, + 0.024710441008210182, + 0.02576535753905773, + 0.027261890470981598, + 0.028845345601439476, + 0.030190717428922653, + 0.030940018594264984, + 0.03170791268348694, + 0.03224319964647293, + 0.03234747424721718, + 0.03245208412408829, + 0.033067844808101654, + 0.03458715230226517, + 0.03617627173662186, + 0.03725634142756462, + 0.037346251308918, + 0.037436384707689285, + 0.03806834667921066, + 0.03980788588523865, + 0.04162691533565521, + 0.04332408681511879, + 0.044587649405002594, + 0.04588806629180908, + 0.04700286686420441, + 0.04741235449910164, + 0.0478254109621048, + 0.04834883660078049, + 0.049451909959316254, + 0.05058015137910843, + 0.051695264875888824, + 0.052264273166656494, + 0.05283954367041588, + 0.05342114716768265, + 0.053949024528265, + 0.05447911471128464, + 0.05501440539956093, + 0.05481266230344772, + 0.05445420742034912, + 0.05409809947013855, + 0.054258793592453, + 0.05466882884502411, + 0.055081963539123535, + 0.055655594915151596, + 0.05638759210705757, + 0.05712921917438507, + 0.05751052126288414, + 0.057140596210956573, + 0.056773047894239426, + 0.056555718183517456, + 0.057353224605321884, + 0.05816197395324707, + 0.058982133865356445, + 0.058577604591846466, + 0.05805467814207077, + 0.057536426931619644, + 0.058191537857055664, + 0.05943881347775459, + 0.06071282550692558, + 0.061233580112457275, + 0.060676075518131256, + 0.060123641043901443, + 0.059439923614263535, + 0.05796843022108078, + 0.056533362716436386, + 0.05513382703065872, + 0.05350053310394287, + 0.05187050253152847, + 0.05029014125466347, + 0.049125127494335175, + 0.0482928641140461, + 0.0474747009575367, + 0.046406134963035583, + 0.044416509568691254, + 0.004711390007287264, + 0.004891579505056143, + 0.005067961756139994, + 0.005194460973143578, + 0.005324116442352533, + 0.005421221721917391, + 0.005472176242619753, + 0.005523609928786755, + 0.005663630086928606, + 0.0058500031009316444, + 0.006042508874088526, + 0.006302125286310911, + 0.006578706204891205, + 0.006847858428955078, + 0.007000282872468233, + 0.007156100124120712, + 0.007364429067820311, + 0.007677565328776836, + 0.008004016242921352, + 0.008308452554047108, + 0.008591408841311932, + 0.008884002454578876, + 0.009206325747072697, + 0.009549077600240707, + 0.0099045904353261, + 0.010381833650171757, + 0.010901007801294327, + 0.011446145363152027, + 0.011563550680875778, + 0.01168153341859579, + 0.011861979030072689, + 0.012497789226472378, + 0.013167680241167545, + 0.013773852959275246, + 0.0140669671818614, + 0.014366320334374905, + 0.014743390493094921, + 0.01528480090200901, + 0.015846094116568565, + 0.016446268185973167, + 0.017097793519496918, + 0.01777512952685356, + 0.018504731357097626, + 0.019295666366815567, + 0.0201204102486372, + 0.02084018848836422, + 0.02144169993698597, + 0.022060571238398552, + 0.023177390918135643, + 0.024814076721668243, + 0.026566334068775177, + 0.02738204598426819, + 0.027306968346238136, + 0.0272320955991745, + 0.02779601700603962, + 0.02896866202354431, + 0.03019077703356743, + 0.03123665601015091, + 0.03208725526928902, + 0.03296101465821266, + 0.033990535885095596, + 0.035212110728025436, + 0.03647758811712265, + 0.037862349301576614, + 0.03941396623849869, + 0.04102917015552521, + 0.042254917323589325, + 0.04256153479218483, + 0.04287037253379822, + 0.04369454085826874, + 0.04630925506353378, + 0.04908043146133423, + 0.05157347396016121, + 0.050925251096487045, + 0.05028517544269562, + 0.04965314641594887, + 0.052219439297914505, + 0.054944269359111786, + 0.05781128630042076, + 0.05883672833442688, + 0.05951980501413345, + 0.06021082028746605, + 0.061789996922016144, + 0.06383516639471054, + 0.06594803184270859, + 0.06781400740146637, + 0.06940950453281403, + 0.07104254513978958, + 0.0721283033490181, + 0.07186880707740784, + 0.07161024957895279, + 0.07138445973396301, + 0.0715094581246376, + 0.0716346800327301, + 0.07176011800765991, + 0.07110865414142609, + 0.07032538205385208, + 0.06955073773860931, + 0.0700744241476059, + 0.0715065747499466, + 0.0729680061340332, + 0.07361625880002975, + 0.07250235229730606, + 0.0714053064584732, + 0.07032595574855804, + 0.06929805874824524, + 0.06828518211841583, + 0.06728710979223251, + 0.06560080498456955, + 0.06369306892156601, + 0.06184082105755806, + 0.059999290853738785, + 0.058147866278886795, + 0.004502399824559689, + 0.004620326217263937, + 0.004732135683298111, + 0.004830597434192896, + 0.0049311090260744095, + 0.005069396924227476, + 0.005232592113316059, + 0.005401040427386761, + 0.0055431281216442585, + 0.0056848954409360886, + 0.0058236876502633095, + 0.005919021088629961, + 0.006015915889292955, + 0.006172656547278166, + 0.0064476956613361835, + 0.006734990514814854, + 0.006987926550209522, + 0.007210893090814352, + 0.007440973538905382, + 0.007722856011241674, + 0.008031556382775307, + 0.008352596312761307, + 0.00841526873409748, + 0.008453581482172012, + 0.00852462649345398, + 0.009023227728903294, + 0.009550992399454117, + 0.010050431825220585, + 0.010351620614528656, + 0.0106618357822299, + 0.010953549295663834, + 0.011198180727660656, + 0.011448276229202747, + 0.011722257360816002, + 0.012025724165141582, + 0.01233704760670662, + 0.01276783924549818, + 0.013311376795172691, + 0.01387805212289095, + 0.014380193315446377, + 0.014844502322375774, + 0.015323801897466183, + 0.015851866453886032, + 0.016414327546954155, + 0.016996746882796288, + 0.017366381362080574, + 0.0176540594547987, + 0.017946500331163406, + 0.018631184473633766, + 0.019477035850286484, + 0.020361289381980896, + 0.020772261545062065, + 0.02103015035390854, + 0.02129123918712139, + 0.022663408890366554, + 0.024519501253962517, + 0.026527605950832367, + 0.027020728215575218, + 0.026920679956674576, + 0.02682100050151348, + 0.027400916442275047, + 0.02830934152007103, + 0.029247883707284927, + 0.030161509290337563, + 0.031070271506905556, + 0.03200641646981239, + 0.0332564078271389, + 0.03479168191552162, + 0.036397840827703476, + 0.037639133632183075, + 0.03840940073132515, + 0.039195429533720016, + 0.04017983004450798, + 0.0415283665060997, + 0.042922165244817734, + 0.044508300721645355, + 0.046663977205753326, + 0.04892405495047569, + 0.051204148679971695, + 0.05258655920624733, + 0.05400629714131355, + 0.055464357137680054, + 0.05755758658051491, + 0.05978246405720711, + 0.0620933435857296, + 0.06401026993989944, + 0.06581361591815948, + 0.06766775995492935, + 0.06933194398880005, + 0.07082906365394592, + 0.07235850393772125, + 0.07399337738752365, + 0.07581789791584015, + 0.07768741250038147, + 0.07951293885707855, + 0.0804804116487503, + 0.081459641456604, + 0.08245079964399338, + 0.08307813853025436, + 0.08363810181617737, + 0.08420183509588242, + 0.08513902872800827, + 0.08637133240699768, + 0.08762146532535553, + 0.08838177472352982, + 0.08783869445323944, + 0.08729895204305649, + 0.08676252514123917, + 0.08654327690601349, + 0.08633393049240112, + 0.08612509816884995, + 0.08437715470790863, + 0.08184367418289185, + 0.004576548468321562, + 0.0047415378503501415, + 0.004815422464162111, + 0.004834333900362253, + 0.004853319376707077, + 0.004943373613059521, + 0.0050429729744791985, + 0.0051561701111495495, + 0.00533643551170826, + 0.005523004103451967, + 0.005697823129594326, + 0.005849328823387623, + 0.006004863418638706, + 0.006247041281312704, + 0.006552903912961483, + 0.006873740814626217, + 0.00711402902379632, + 0.007341556716710329, + 0.0075794244185090065, + 0.008038952015340328, + 0.008526341058313847, + 0.008899475447833538, + 0.008675530552864075, + 0.008457222022116184, + 0.00841397326439619, + 0.008694371208548546, + 0.008984114974737167, + 0.00922070536762476, + 0.009397631511092186, + 0.009577951394021511, + 0.009848861955106258, + 0.010182730853557587, + 0.010527917183935642, + 0.010797900147736073, + 0.011042194440960884, + 0.011292017064988613, + 0.01173308677971363, + 0.01223245169967413, + 0.012753068469464779, + 0.013397026807069778, + 0.014084807597100735, + 0.014807898551225662, + 0.015017585828900337, + 0.015211045742034912, + 0.0154068972915411, + 0.015596623532474041, + 0.015788685530424118, + 0.01599065400660038, + 0.01637873984873295, + 0.016776245087385178, + 0.017179250717163086, + 0.017514972016215324, + 0.017857253551483154, + 0.018213419243693352, + 0.018725398927927017, + 0.01925176940858364, + 0.019793350249528885, + 0.020366523414850235, + 0.02095629833638668, + 0.021563148126006126, + 0.022516658529639244, + 0.023517059162259102, + 0.024561909958720207, + 0.024832960218191147, + 0.02504616603255272, + 0.025261202827095985, + 0.026187656447291374, + 0.027272485196590424, + 0.02840225212275982, + 0.02935534343123436, + 0.030270500108599663, + 0.031214186921715736, + 0.03220995143055916, + 0.03324960172176361, + 0.03432280942797661, + 0.035641469061374664, + 0.03720347583293915, + 0.03883393853902817, + 0.04071090742945671, + 0.042967043817043304, + 0.045348215848207474, + 0.04772378131747246, + 0.04974028840661049, + 0.051841989159584045, + 0.05406324937939644, + 0.05698418989777565, + 0.06006293743848801, + 0.06330803036689758, + 0.0655771940946579, + 0.0677260160446167, + 0.06994524598121643, + 0.0723089650273323, + 0.07479444146156311, + 0.07736535370349884, + 0.0800507590174675, + 0.08286885172128677, + 0.08578614890575409, + 0.08862417936325073, + 0.09054382145404816, + 0.09250503033399582, + 0.09450872987508774, + 0.09775277972221375, + 0.10126779973506927, + 0.10490921139717102, + 0.10743696242570877, + 0.10917974263429642, + 0.11095079779624939, + 0.11228565126657486, + 0.11250684410333633, + 0.11272846162319183, + 0.11295052617788315, + 0.11264510452747345, + 0.11232295632362366, + 0.0035716292914003134, + 0.0036562250461429358, + 0.0036739676725119352, + 0.0036886208690702915, + 0.003724880749359727, + 0.003836762858554721, + 0.003952004946768284, + 0.0040137385949492455, + 0.004015141632407904, + 0.004016545135527849, + 0.0041646938771009445, + 0.004378397483378649, + 0.0046030678786337376, + 0.0047039152123034, + 0.004799233749508858, + 0.004916460253298283, + 0.005149594973772764, + 0.005393785424530506, + 0.005567604210227728, + 0.005591829773038626, + 0.005616160109639168, + 0.005687351804226637, + 0.005802594590932131, + 0.0059201717376708984, + 0.00608748197555542, + 0.006281891372054815, + 0.00648250849917531, + 0.006677360739558935, + 0.006875534541904926, + 0.007079589646309614, + 0.007202200125902891, + 0.007323331665247679, + 0.007458958309143782, + 0.007758160121738911, + 0.008069364354014397, + 0.008391649462282658, + 0.008719720877707005, + 0.009060618467628956, + 0.009367660619318485, + 0.009540854021906853, + 0.009717249311506748, + 0.009833240881562233, + 0.009811768308281898, + 0.00979034136980772, + 0.009970635175704956, + 0.010526489466428757, + 0.011113331653177738, + 0.011754684150218964, + 0.012468783184885979, + 0.013226262293756008, + 0.013493645004928112, + 0.013005588203668594, + 0.012535184621810913, + 0.012376337312161922, + 0.012662030756473541, + 0.012954317033290863, + 0.013239173218607903, + 0.013507068157196045, + 0.01378038339316845, + 0.014130953699350357, + 0.014629839919507504, + 0.015146340243518353, + 0.0157166700810194, + 0.016397904604673386, + 0.017108669504523277, + 0.017763474956154823, + 0.018130933865904808, + 0.018505996093153954, + 0.01896098256111145, + 0.019914401695132256, + 0.020915763452649117, + 0.021962784230709076, + 0.022888656705617905, + 0.023853562772274017, + 0.024859145283699036, + 0.02623455785214901, + 0.027723005041480064, + 0.029295898973941803, + 0.03144022822380066, + 0.033903855830430984, + 0.0365605354309082, + 0.038838520646095276, + 0.04085525497794151, + 0.04297671467065811, + 0.045047592371702194, + 0.04699380323290825, + 0.04902409762144089, + 0.05151508003473282, + 0.05544079467654228, + 0.05966567248106003, + 0.06418082118034363, + 0.06745229661464691, + 0.07089052349328995, + 0.07450401037931442, + 0.0779494047164917, + 0.08145655691623688, + 0.0851215124130249, + 0.0896691158413887, + 0.09510478377342224, + 0.10086996853351593, + 0.10717053711414337, + 0.11438869684934616, + 0.12209302186965942, + 0.13031624257564545, + 0.1371871381998062, + 0.1443977952003479, + 0.1519874483346939, + 0.15863607823848724, + 0.16493579745292664, + 0.17148569226264954, + 0.17291249334812164, + 0.16518500447273254, + 0.15780285000801086, + 0.004105187952518463, + 0.004348962102085352, + 0.004520656540989876, + 0.004699129145592451, + 0.004831744823604822, + 0.0049334303475916386, + 0.005037256050854921, + 0.005249519366770983, + 0.005488038528710604, + 0.00571396853774786, + 0.005752102471888065, + 0.005790491122752428, + 0.005834513809531927, + 0.005889649502933025, + 0.005945306736975908, + 0.0060881064273417, + 0.006309132557362318, + 0.006538183428347111, + 0.006608085241168737, + 0.006620557978749275, + 0.006633054930716753, + 0.006813457235693932, + 0.007013893686234951, + 0.007211740128695965, + 0.007320457603782415, + 0.0074308146722614765, + 0.007637145929038525, + 0.008180064149200916, + 0.008761577308177948, + 0.009159068576991558, + 0.009174392558634281, + 0.009189743548631668, + 0.009302264079451561, + 0.00952474307268858, + 0.009752543643116951, + 0.009936593472957611, + 0.010087518021464348, + 0.010240734554827213, + 0.010444250889122486, + 0.010677154175937176, + 0.010915251448750496, + 0.011139455251395702, + 0.011360869742929935, + 0.011586682870984077, + 0.011959309689700603, + 0.01238679327070713, + 0.012829556129872799, + 0.013191230595111847, + 0.013539586216211319, + 0.013897141441702843, + 0.014089396223425865, + 0.0142469247803092, + 0.014406216330826283, + 0.014711908996105194, + 0.015055797062814236, + 0.015407723374664783, + 0.01581145077943802, + 0.01623649336397648, + 0.01667296141386032, + 0.016953954473137856, + 0.017189837992191315, + 0.017429005354642868, + 0.017833249643445015, + 0.018311435356736183, + 0.018802443519234657, + 0.019411100074648857, + 0.02009730041027069, + 0.02080775983631611, + 0.021626314148306847, + 0.022543486207723618, + 0.02349955216050148, + 0.024561699479818344, + 0.025751754641532898, + 0.026999467983841896, + 0.028220636770129204, + 0.029322348535060883, + 0.030467072501778603, + 0.03177810087800026, + 0.03364904597401619, + 0.03563014045357704, + 0.037712156772613525, + 0.03957636281847954, + 0.0415327213704586, + 0.04358578845858574, + 0.04599350690841675, + 0.04857340827584267, + 0.051298025995492935, + 0.054042503237724304, + 0.05686816945672035, + 0.0598415769636631, + 0.062459755688905716, + 0.06459785252809525, + 0.06680914014577866, + 0.06950102001428604, + 0.07363316416740417, + 0.07801098376512527, + 0.08264908194541931, + 0.08826776593923569, + 0.09427125006914139, + 0.1006830558180809, + 0.10624862462282181, + 0.11162978410720825, + 0.11728347837924957, + 0.12262897938489914, + 0.12745873630046844, + 0.1324787139892578, + 0.13788209855556488, + 0.14462916553020477, + 0.15170638263225555, + 0.15912991762161255, + 0.15732017159461975, + 0.15362006425857544, + 0.15000700950622559, + 0.005276883952319622, + 0.005449134390801191, + 0.005624368321150541, + 0.005803717765957117, + 0.0059579904191195965, + 0.006116364151239395, + 0.006266220007091761, + 0.006390602793544531, + 0.006517454050481319, + 0.006739475764334202, + 0.007047475781291723, + 0.007369553204625845, + 0.0076852599158883095, + 0.008008374832570553, + 0.008345073089003563, + 0.008325205184519291, + 0.008303751237690449, + 0.008319292217493057, + 0.008491148240864277, + 0.008666555397212505, + 0.008906509727239609, + 0.009258339181542397, + 0.009624066762626171, + 0.009886067360639572, + 0.01005342323333025, + 0.010223613120615482, + 0.010300982743501663, + 0.010336169973015785, + 0.010371477343142033, + 0.010625581257045269, + 0.010933921672403812, + 0.011251209303736687, + 0.011426555924117565, + 0.011595446616411209, + 0.011780188418924809, + 0.012261215597391129, + 0.012761885300278664, + 0.013247344642877579, + 0.013506130315363407, + 0.013769972138106823, + 0.014055347070097923, + 0.014414194040000439, + 0.014782202430069447, + 0.015111011452972889, + 0.015299990773200989, + 0.015491332858800888, + 0.01564062386751175, + 0.015680331736803055, + 0.01572013646364212, + 0.015840724110603333, + 0.016148339956998825, + 0.016461927443742752, + 0.016699863597750664, + 0.016756370663642883, + 0.016813069581985474, + 0.01704227924346924, + 0.01770295575261116, + 0.018389245495200157, + 0.01904657669365406, + 0.019565796479582787, + 0.020099172368645668, + 0.02056841552257538, + 0.020753294229507446, + 0.020939834415912628, + 0.021193167194724083, + 0.02183688059449196, + 0.022500144317746162, + 0.023155666887760162, + 0.023410415276885033, + 0.023667966946959496, + 0.02392835170030594, + 0.025255423039197922, + 0.026700513437390327, + 0.028228288516402245, + 0.029295308515429497, + 0.030299121513962746, + 0.03133733198046684, + 0.032651398330926895, + 0.03412392735481262, + 0.03566286340355873, + 0.03758261352777481, + 0.039870306849479675, + 0.042297251522541046, + 0.04471229761838913, + 0.046996112912893295, + 0.0493965782225132, + 0.051638439297676086, + 0.05278696492314339, + 0.053961027413606644, + 0.05516120418906212, + 0.057591915130615234, + 0.060144972056150436, + 0.06281120330095291, + 0.06596721708774567, + 0.06940346211194992, + 0.07301870733499527, + 0.0765213742852211, + 0.07990177720785141, + 0.08343151211738586, + 0.08744189888238907, + 0.09263011813163757, + 0.09812617301940918, + 0.10394831746816635, + 0.1123875081539154, + 0.12156720459461212, + 0.13149668276309967, + 0.13670845329761505, + 0.1394965946674347, + 0.14234158396720886, + 0.1456345021724701, + 0.14970728754997253, + 0.15389396250247955, + 0.15793879330158234, + 0.015527443960309029, + 0.01548315491527319, + 0.015438990667462349, + 0.015484110452234745, + 0.015728740021586418, + 0.01597723551094532, + 0.01624304987490177, + 0.01652343198657036, + 0.016808655112981796, + 0.01718907803297043, + 0.01759854331612587, + 0.018022358417510986, + 0.018546393141150475, + 0.01908566616475582, + 0.019581587985157967, + 0.019923171028494835, + 0.020270714536309242, + 0.02084791474044323, + 0.021710259839892387, + 0.022608274593949318, + 0.02306455373764038, + 0.02326824702322483, + 0.023473739624023438, + 0.023807553574442863, + 0.02417531982064247, + 0.024548767134547234, + 0.02455816976726055, + 0.02455492876470089, + 0.024599971249699593, + 0.025073755532503128, + 0.025556663051247597, + 0.025954563170671463, + 0.026025056838989258, + 0.026095744222402573, + 0.026255497708916664, + 0.026603082194924355, + 0.026955267414450645, + 0.02743668109178543, + 0.028108911588788033, + 0.028797613456845284, + 0.02955404482781887, + 0.030386514961719513, + 0.031242437660694122, + 0.031884610652923584, + 0.03233131393790245, + 0.03278427943587303, + 0.03375839442014694, + 0.03516138717532158, + 0.03662269189953804, + 0.037187620997428894, + 0.03711068630218506, + 0.03703391179442406, + 0.03646600991487503, + 0.03558476269245148, + 0.03472480922937393, + 0.034525420516729355, + 0.03478654474020004, + 0.035049647092819214, + 0.03585036098957062, + 0.037115614861249924, + 0.03842552378773689, + 0.039146557450294495, + 0.03926265239715576, + 0.03937908634543419, + 0.03980075195431709, + 0.040617771446704865, + 0.04145156592130661, + 0.04219399765133858, + 0.04275527596473694, + 0.04332401975989342, + 0.04387397691607475, + 0.04435596242547035, + 0.044843245297670364, + 0.04528859257698059, + 0.04545977711677551, + 0.04563160613179207, + 0.045805033296346664, + 0.04605865478515625, + 0.046313680708408356, + 0.04657011851668358, + 0.047251902520656586, + 0.04801395162940025, + 0.048788294196128845, + 0.049564749002456665, + 0.05034884437918663, + 0.051145341247320175, + 0.05202466994524002, + 0.05298968032002449, + 0.05397259071469307, + 0.054324228316545486, + 0.05316879227757454, + 0.05203792825341225, + 0.050964564085006714, + 0.05032108724117279, + 0.04968573525547981, + 0.04905840381979942, + 0.04919927194714546, + 0.04949469864368439, + 0.04979189857840538, + 0.050046540796756744, + 0.05026933178305626, + 0.05049312114715576, + 0.05027732998132706, + 0.049030013382434845, + 0.04781363904476166, + 0.04662744328379631, + 0.0455440878868103, + 0.04448601230978966, + 0.04345251992344856, + 0.04310593381524086, + 0.043070558458566666, + 0.043035220354795456, + 0.042267125099897385, + 0.012433964759111404, + 0.012759451754391193, + 0.013053103350102901, + 0.013353513553738594, + 0.013712468557059765, + 0.014088829979300499, + 0.014481492340564728, + 0.014925641939043999, + 0.015383414924144745, + 0.015714025124907494, + 0.015814460813999176, + 0.015915537253022194, + 0.016326017677783966, + 0.016958650201559067, + 0.017615796998143196, + 0.017815861850976944, + 0.01790977083146572, + 0.018009072169661522, + 0.018502572551369667, + 0.019009599462151527, + 0.019624631851911545, + 0.020669862627983093, + 0.021770766004920006, + 0.022623026743531227, + 0.022947700694203377, + 0.02327703684568405, + 0.023592621088027954, + 0.02389432303607464, + 0.02419988438487053, + 0.02486475557088852, + 0.025755202397704124, + 0.026677537709474564, + 0.027379289269447327, + 0.02801656350493431, + 0.028668668121099472, + 0.028780775144696236, + 0.0288019347935915, + 0.028823107481002808, + 0.0314556360244751, + 0.03451233729720116, + 0.03779752925038338, + 0.03445398434996605, + 0.03140620142221451, + 0.02883872576057911, + 0.029643062502145767, + 0.030469832941889763, + 0.03126290813088417, + 0.03153091296553612, + 0.031801220029592514, + 0.03225027769804001, + 0.03413734585046768, + 0.036134835332632065, + 0.03785792738199234, + 0.03663381561636925, + 0.035449281334877014, + 0.034538354724645615, + 0.03581668436527252, + 0.037142325192689896, + 0.0384422205388546, + 0.03870686516165733, + 0.038973331451416016, + 0.03924574702978134, + 0.03977479785680771, + 0.04031098634004593, + 0.04085439816117287, + 0.04052874073386192, + 0.0401594303548336, + 0.039793480187654495, + 0.04139995947480202, + 0.04340144991874695, + 0.04549969732761383, + 0.045804861932992935, + 0.04553438350558281, + 0.045265503227710724, + 0.04548214375972748, + 0.045971520245075226, + 0.0464661605656147, + 0.04693692922592163, + 0.04738376662135124, + 0.0478348545730114, + 0.04848935827612877, + 0.049526482820510864, + 0.050585780292749405, + 0.05177134647965431, + 0.05347134917974472, + 0.05522717908024788, + 0.057040661573410034, + 0.05556470528244972, + 0.054093390703201294, + 0.05266103520989418, + 0.05289983004331589, + 0.053608328104019165, + 0.054326314479112625, + 0.05395865812897682, + 0.052736807614564896, + 0.051542628556489944, + 0.05073533579707146, + 0.05073627084493637, + 0.050737205892801285, + 0.05071663111448288, + 0.050269268453121185, + 0.04982585832476616, + 0.04938635602593422, + 0.0484355092048645, + 0.04735017567873001, + 0.046289168298244476, + 0.045360490679740906, + 0.04457218945026398, + 0.04379758983850479, + 0.04310178384184837, + 0.042787060141563416, + 0.04247463867068291, + 0.04216449707746506, + 0.012793959118425846, + 0.013214963488280773, + 0.013513481244444847, + 0.013818740844726562, + 0.014266368001699448, + 0.014874824322760105, + 0.015509231016039848, + 0.015862910076975822, + 0.016119979321956635, + 0.016381215304136276, + 0.017808087170124054, + 0.01937311328947544, + 0.02052428014576435, + 0.019741995260119438, + 0.018989527598023415, + 0.018781442195177078, + 0.01928684487938881, + 0.019805848598480225, + 0.02028484083712101, + 0.02074163220822811, + 0.021208710968494415, + 0.021486666053533554, + 0.021717628464102745, + 0.02195107564330101, + 0.022528333589434624, + 0.023134855553507805, + 0.02380412258207798, + 0.024888835847377777, + 0.026022978127002716, + 0.02691708132624626, + 0.026903577148914337, + 0.02689008042216301, + 0.026824237778782845, + 0.02666340582072735, + 0.026503534987568855, + 0.02688768319785595, + 0.027960631996393204, + 0.02907639555633068, + 0.029766475781798363, + 0.03005882538855076, + 0.030354047194123268, + 0.03076995350420475, + 0.031271617859601974, + 0.03178146108984947, + 0.031834810972213745, + 0.031638532876968384, + 0.03144346550107002, + 0.032145991921424866, + 0.033303339034318924, + 0.03450234979391098, + 0.03451871871948242, + 0.03401307761669159, + 0.033514849841594696, + 0.03419928625226021, + 0.03543775901198387, + 0.036721084266901016, + 0.037753913551568985, + 0.03867075964808464, + 0.0396098718047142, + 0.04030195623636246, + 0.04085348919034004, + 0.04141256958246231, + 0.04133196547627449, + 0.040806952863931656, + 0.04028861224651337, + 0.04079518839716911, + 0.042284607887268066, + 0.043828412890434265, + 0.04466646909713745, + 0.044522594660520554, + 0.044379182159900665, + 0.04431525617837906, + 0.044413067400455475, + 0.0445111021399498, + 0.044652558863162994, + 0.04496103897690773, + 0.045271653681993484, + 0.04568968340754509, + 0.047602880746126175, + 0.04959619790315628, + 0.051672983914613724, + 0.05081338807940483, + 0.04968523606657982, + 0.048582132905721664, + 0.04850739613175392, + 0.04879794269800186, + 0.04909022897481918, + 0.04930809885263443, + 0.04946264997124672, + 0.04961768165230751, + 0.04981134831905365, + 0.05008281394839287, + 0.050355762243270874, + 0.05062496289610863, + 0.050849977880716324, + 0.051075998693704605, + 0.051303017884492874, + 0.05194162204861641, + 0.05265817791223526, + 0.05338461697101593, + 0.05271727219223976, + 0.05112048611044884, + 0.04957206919789314, + 0.048298344016075134, + 0.047561317682266235, + 0.046835534274578094, + 0.04612112045288086, + 0.04547237604856491, + 0.044832754880189896, + 0.044202134013175964, + 0.04385072737932205, + 0.04362642392516136, + 0.043403271585702896, + 0.012787959538400173, + 0.013085789047181606, + 0.01323994342237711, + 0.013378559611737728, + 0.013549263589084148, + 0.013877231627702713, + 0.014213139191269875, + 0.014588757418096066, + 0.015018677338957787, + 0.015461267903447151, + 0.015918059274554253, + 0.01638895645737648, + 0.016873782500624657, + 0.0173694659024477, + 0.017879251390695572, + 0.018391471356153488, + 0.01879575103521347, + 0.019208915531635284, + 0.01965903490781784, + 0.020190568640828133, + 0.02073647640645504, + 0.021212583407759666, + 0.021600237116217613, + 0.021994976326823235, + 0.022245628759264946, + 0.02240789122879505, + 0.02257133461534977, + 0.02304517850279808, + 0.023624036461114883, + 0.024217432364821434, + 0.025365615263581276, + 0.026632562279701233, + 0.02794666960835457, + 0.027912024408578873, + 0.027877425774931908, + 0.02789486013352871, + 0.028346270322799683, + 0.02880498580634594, + 0.02925732173025608, + 0.02965623140335083, + 0.030060581862926483, + 0.030514730140566826, + 0.03110998496413231, + 0.03171684965491295, + 0.032222796231508255, + 0.032469023019075394, + 0.032717131078243256, + 0.032892655581235886, + 0.03291670233011246, + 0.03294076398015022, + 0.033162590116262436, + 0.03377190977334976, + 0.034392423927783966, + 0.03504905477166176, + 0.03576739877462387, + 0.036500465124845505, + 0.03714558482170105, + 0.03757915273308754, + 0.038017772138118744, + 0.03826973959803581, + 0.038035113364458084, + 0.03780192881822586, + 0.03787202388048172, + 0.038989026099443436, + 0.04013897478580475, + 0.04124952107667923, + 0.04198449105024338, + 0.04273255541920662, + 0.04352844879031181, + 0.044833116233348846, + 0.046176884323358536, + 0.047560933977365494, + 0.0479467399418354, + 0.04829305782914162, + 0.0486418716609478, + 0.04842318594455719, + 0.048095494508743286, + 0.04777001962065697, + 0.04770543426275253, + 0.047754596918821335, + 0.04780380427837372, + 0.04793843999505043, + 0.04814763367176056, + 0.04835774376988411, + 0.04871686175465584, + 0.04934588447213173, + 0.049983032047748566, + 0.050538819283246994, + 0.05064292252063751, + 0.05074723809957504, + 0.050851766020059586, + 0.051271747797727585, + 0.05171144753694534, + 0.05215492099523544, + 0.05245177820324898, + 0.05269177258014679, + 0.052932869642972946, + 0.05292416363954544, + 0.05263553559780121, + 0.052348483353853226, + 0.05197096988558769, + 0.05124100670218468, + 0.05052129179239273, + 0.04981169104576111, + 0.049410413950681686, + 0.04903890937566757, + 0.048670198768377304, + 0.048000115901231766, + 0.047151289880275726, + 0.046317484229803085, + 0.04549224674701691, + 0.04466691613197327, + 0.043856557458639145, + 0.012575069442391396, + 0.012826845981180668, + 0.01316761877387762, + 0.013567550107836723, + 0.013979630544781685, + 0.014404335990548134, + 0.01484195701777935, + 0.015281892381608486, + 0.015673890709877014, + 0.016075944527983665, + 0.016675325110554695, + 0.017599431797862053, + 0.018574750050902367, + 0.01911110430955887, + 0.019354185089468956, + 0.019600357860326767, + 0.019668640568852425, + 0.019698474556207657, + 0.01973612792789936, + 0.020300259813666344, + 0.02088051848113537, + 0.021468674764037132, + 0.02203536592423916, + 0.022617019712924957, + 0.02307533659040928, + 0.023281710222363472, + 0.023489929735660553, + 0.023847850039601326, + 0.024366693571209908, + 0.02489682286977768, + 0.025710992515087128, + 0.02672571875154972, + 0.02778049185872078, + 0.028366796672344208, + 0.02877619117498398, + 0.02919149398803711, + 0.03012271597981453, + 0.03119577467441559, + 0.032307058572769165, + 0.032207638025283813, + 0.031979236751794815, + 0.03175245225429535, + 0.03188188746571541, + 0.03202439844608307, + 0.0321759469807148, + 0.03305962681770325, + 0.03396757319569588, + 0.034863878041505814, + 0.03489845246076584, + 0.03493306040763855, + 0.034990180283784866, + 0.035459160804748535, + 0.03593442216515541, + 0.036449506878852844, + 0.03766308352351189, + 0.03891706466674805, + 0.040174297988414764, + 0.03997527435421944, + 0.0397772379219532, + 0.03958018496632576, + 0.0398409478366375, + 0.04010975360870361, + 0.040380366146564484, + 0.040891554206609726, + 0.04142732173204422, + 0.04197010397911072, + 0.04294651746749878, + 0.04401870444417, + 0.04511765390634537, + 0.04513762518763542, + 0.044826146215200424, + 0.04451682046055794, + 0.045322008430957794, + 0.046739544719457626, + 0.04820142313838005, + 0.048587117344141006, + 0.04800701141357422, + 0.04743382707238197, + 0.047203339636325836, + 0.04750123247504234, + 0.047800999134778976, + 0.04801354557275772, + 0.047927409410476685, + 0.047841425985097885, + 0.04774225875735283, + 0.04739443212747574, + 0.0470491424202919, + 0.046706363558769226, + 0.047168996185064316, + 0.047776155173778534, + 0.04839112237095833, + 0.048686232417821884, + 0.048798155039548874, + 0.04891033470630646, + 0.049005281180143356, + 0.04907483980059624, + 0.04914450645446777, + 0.04914894700050354, + 0.04880083352327347, + 0.04845517873764038, + 0.04811197891831398, + 0.048270925879478455, + 0.04849497601389885, + 0.04872005805373192, + 0.048674751073122025, + 0.048448625952005386, + 0.048223547637462616, + 0.047592904418706894, + 0.04601415619254112, + 0.04448777809739113, + 0.04301203414797783, + 0.04407718777656555, + 0.045256663113832474, + 0.011849184520542622, + 0.012246085330843925, + 0.012586204335093498, + 0.012840203940868378, + 0.013099327683448792, + 0.013590880669653416, + 0.01420509908348322, + 0.014847075566649437, + 0.015376454219222069, + 0.015916772186756134, + 0.01645231433212757, + 0.016898343339562416, + 0.01735646463930607, + 0.017864936962723732, + 0.01844540797173977, + 0.01904473826289177, + 0.019399166107177734, + 0.019591623917222023, + 0.019785992801189423, + 0.02026831917464733, + 0.02083521895110607, + 0.021417975425720215, + 0.021629875525832176, + 0.02183452434837818, + 0.022103801369667053, + 0.022788846865296364, + 0.02349511906504631, + 0.02425173856317997, + 0.02510964870452881, + 0.025997906923294067, + 0.02673754282295704, + 0.02722596935927868, + 0.027723321691155434, + 0.028274118900299072, + 0.028878934681415558, + 0.02949669025838375, + 0.029868289828300476, + 0.030075116083025932, + 0.030283378437161446, + 0.03082437813282013, + 0.03153260052204132, + 0.032257091253995895, + 0.03245686739683151, + 0.03247249871492386, + 0.0324881412088871, + 0.03413013368844986, + 0.03632889688014984, + 0.03866931051015854, + 0.03821317479014397, + 0.03713290020823479, + 0.0360831655561924, + 0.03604336082935333, + 0.036213066428899765, + 0.03638357296586037, + 0.037242304533720016, + 0.0382775254547596, + 0.0393415205180645, + 0.039886970072984695, + 0.040299542248249054, + 0.04071638360619545, + 0.04134995862841606, + 0.04206297919154167, + 0.042788296937942505, + 0.04285247251391411, + 0.042630039155483246, + 0.04240876063704491, + 0.04265833646059036, + 0.04319548234343529, + 0.04373939335346222, + 0.044007740914821625, + 0.04403030127286911, + 0.04405287653207779, + 0.044140126556158066, + 0.04431580752134323, + 0.044492192566394806, + 0.0448889434337616, + 0.04581844434142113, + 0.046767186373472214, + 0.04772569239139557, + 0.04864778742194176, + 0.04958769306540489, + 0.050545766949653625, + 0.04990566894412041, + 0.0492582693696022, + 0.04861927404999733, + 0.04930904507637024, + 0.050327472388744354, + 0.05136694014072418, + 0.05170676112174988, + 0.05159447714686394, + 0.051482442766427994, + 0.051069214940071106, + 0.05020724609494209, + 0.049359820783138275, + 0.04861236736178398, + 0.048314258456230164, + 0.04801798239350319, + 0.047723520547151566, + 0.047589801251888275, + 0.04747217521071434, + 0.047354843467473984, + 0.04712076857686043, + 0.046822261065244675, + 0.04652564600110054, + 0.04616183787584305, + 0.045673955231904984, + 0.04519123584032059, + 0.044715505093336105, + 0.04428691044449806, + 0.043862417340278625, + 0.04344199597835541, + 0.04261526092886925, + 0.0416458360850811, + 0.01238653901964426, + 0.012709196656942368, + 0.013048053719103336, + 0.0134164122864604, + 0.013795169070363045, + 0.01423893216997385, + 0.014743314124643803, + 0.015265561640262604, + 0.015394389629364014, + 0.015422108583152294, + 0.015470614656805992, + 0.016086433082818985, + 0.016726765781641006, + 0.017313992604613304, + 0.017688127234578133, + 0.018070343881845474, + 0.0185195654630661, + 0.0190504789352417, + 0.019596613943576813, + 0.02007208578288555, + 0.020511744543910027, + 0.020961029455065727, + 0.02154330164194107, + 0.022168930619955063, + 0.022812731564044952, + 0.023639723658561707, + 0.024500016123056412, + 0.025334186851978302, + 0.025774488225579262, + 0.026222441345453262, + 0.026663199067115784, + 0.027065103873610497, + 0.02747306600213051, + 0.02831939049065113, + 0.030013946816325188, + 0.03180989995598793, + 0.032571032643318176, + 0.03196926787495613, + 0.031378623098134995, + 0.031119292601943016, + 0.03115210495889187, + 0.031184952706098557, + 0.031976353377103806, + 0.033350780606269836, + 0.034784283488988876, + 0.035167619585990906, + 0.034906595945358276, + 0.03464750200510025, + 0.0351259671151638, + 0.03601057454943657, + 0.03691745549440384, + 0.03764218091964722, + 0.038276080042123795, + 0.038920652121305466, + 0.03954949229955673, + 0.04017442837357521, + 0.04080923646688461, + 0.040654417127370834, + 0.0400463230907917, + 0.039447326213121414, + 0.039749983698129654, + 0.040685880929231644, + 0.04164380952715874, + 0.041834406554698944, + 0.041345953941345215, + 0.04086320847272873, + 0.04121711477637291, + 0.04258531332015991, + 0.043998926877975464, + 0.04493550583720207, + 0.04497932270169258, + 0.045023176819086075, + 0.045340582728385925, + 0.04647160321474075, + 0.04763083532452583, + 0.04865540936589241, + 0.048577431589365005, + 0.04849957674741745, + 0.04842185229063034, + 0.04836169257760048, + 0.04830191656947136, + 0.04824221506714821, + 0.04821130260825157, + 0.04818674549460411, + 0.04816218838095665, + 0.04794052243232727, + 0.04760909080505371, + 0.04727994278073311, + 0.04739350453019142, + 0.048076383769512177, + 0.04876910150051117, + 0.04949219897389412, + 0.050298430025577545, + 0.051117800176143646, + 0.05195050686597824, + 0.05072181299328804, + 0.049496907740831375, + 0.0483015775680542, + 0.047413550317287445, + 0.04664123058319092, + 0.0458814837038517, + 0.045486751943826675, + 0.045505158603191376, + 0.04552357643842697, + 0.0456424318253994, + 0.046248096972703934, + 0.04686180129647255, + 0.0474836528301239, + 0.04574427753686905, + 0.04371899738907814, + 0.04178338870406151, + 0.040461014956235886, + 0.03962736204266548, + 0.0112826032564044, + 0.01157363224774599, + 0.011886581778526306, + 0.012270024046301842, + 0.012665835209190845, + 0.013224114663898945, + 0.01399303786456585, + 0.014806671068072319, + 0.014946241863071918, + 0.014800475910305977, + 0.014656132087111473, + 0.015310019254684448, + 0.01604161597788334, + 0.016741415485739708, + 0.017126761376857758, + 0.017520977184176445, + 0.01784553751349449, + 0.01804078370332718, + 0.018238164484500885, + 0.018704352900385857, + 0.019400738179683685, + 0.02012304961681366, + 0.020694656297564507, + 0.02121601440012455, + 0.02175050601363182, + 0.02232515625655651, + 0.022918416187167168, + 0.023527374491095543, + 0.024150172248482704, + 0.024789458140730858, + 0.025425713509321213, + 0.025966325774788857, + 0.026518430560827255, + 0.027150020003318787, + 0.027992352843284607, + 0.02886081673204899, + 0.029575666412711143, + 0.02997449040412903, + 0.030378693714737892, + 0.030848421156406403, + 0.03140632435679436, + 0.03197431564331055, + 0.03255980834364891, + 0.03316369652748108, + 0.03377878665924072, + 0.03448713943362236, + 0.03528391197323799, + 0.03609909117221832, + 0.03689640760421753, + 0.03768168389797211, + 0.03848367556929588, + 0.03877495974302292, + 0.038668129593133926, + 0.038561590015888214, + 0.03869953379034996, + 0.039031654596328735, + 0.039366621524095535, + 0.039751507341861725, + 0.04018142446875572, + 0.0406159870326519, + 0.04089879244565964, + 0.041022639721632004, + 0.041146859526634216, + 0.04149157553911209, + 0.042129289358854294, + 0.04277679696679115, + 0.043457891792058945, + 0.04419274628162384, + 0.044940028339624405, + 0.04578413814306259, + 0.04688211530447006, + 0.04800642281770706, + 0.04896802827715874, + 0.04890541732311249, + 0.0488428920507431, + 0.04877864569425583, + 0.0486481748521328, + 0.048518046736717224, + 0.048388272523880005, + 0.04857632517814636, + 0.04880854859948158, + 0.049041882157325745, + 0.04934380203485489, + 0.04967442527413368, + 0.05000726878643036, + 0.05010984465479851, + 0.05001118406653404, + 0.0499127097427845, + 0.050275396555662155, + 0.05157217010855675, + 0.05290239304304123, + 0.05385178327560425, + 0.05176421254873276, + 0.049757566303014755, + 0.04782870411872864, + 0.0482228621840477, + 0.048930417746305466, + 0.04964834824204445, + 0.04963301867246628, + 0.049183495342731476, + 0.04873804375529289, + 0.04808374494314194, + 0.047061219811439514, + 0.04606043919920921, + 0.045112188905477524, + 0.04462132602930069, + 0.04413580149412155, + 0.04365555942058563, + 0.042770594358444214, + 0.041775040328502655, + 0.040802665054798126, + 0.0398324690759182, + 0.03885872662067413, + 0.011082358658313751, + 0.011108205653727055, + 0.011206879280507565, + 0.011688897386193275, + 0.01219164952635765, + 0.012668050825595856, + 0.013097299262881279, + 0.013541091233491898, + 0.013810050673782825, + 0.013994555920362473, + 0.014181526377797127, + 0.014810494147241116, + 0.01550989504903555, + 0.016204124316573143, + 0.016678649932146072, + 0.017167070880532265, + 0.017557669430971146, + 0.017737053334712982, + 0.017918270081281662, + 0.01841302216053009, + 0.019211404025554657, + 0.02004440315067768, + 0.020437441766262054, + 0.020634908229112625, + 0.02083428017795086, + 0.02163008227944374, + 0.02256009541451931, + 0.02353009581565857, + 0.023664087057113647, + 0.023797636851668358, + 0.024073073640465736, + 0.02539336122572422, + 0.026786062866449356, + 0.027895914390683174, + 0.02784234844148159, + 0.027788886800408363, + 0.02789383754134178, + 0.028334802016615868, + 0.028782738372683525, + 0.02926466427743435, + 0.029795950278639793, + 0.030336881056427956, + 0.031053341925144196, + 0.0319887138903141, + 0.032952260226011276, + 0.03405199199914932, + 0.03529932722449303, + 0.03659234568476677, + 0.03721015155315399, + 0.03718869760632515, + 0.0371672585606575, + 0.03700457885861397, + 0.036720938980579376, + 0.03643947094678879, + 0.03652181848883629, + 0.03693222627043724, + 0.03734724223613739, + 0.037711821496486664, + 0.038024988025426865, + 0.03834075108170509, + 0.038871824741363525, + 0.039664048701524734, + 0.04047241806983948, + 0.04117053374648094, + 0.041689567267894745, + 0.042215146124362946, + 0.04272690787911415, + 0.04320205748081207, + 0.04368249699473381, + 0.04417872056365013, + 0.04471554607152939, + 0.045258890837430954, + 0.04576531797647476, + 0.045959290117025375, + 0.04615408927202225, + 0.04634971544146538, + 0.04711756110191345, + 0.04790249839425087, + 0.048700518906116486, + 0.04993326961994171, + 0.05127602815628052, + 0.052654895931482315, + 0.05301657319068909, + 0.052894044667482376, + 0.05277180299162865, + 0.05232228338718414, + 0.0515548512339592, + 0.050798673182725906, + 0.05040363594889641, + 0.05082724988460541, + 0.05125442147254944, + 0.05167132243514061, + 0.05193805322051048, + 0.05220616236329079, + 0.05247565358877182, + 0.05223935842514038, + 0.05191377177834511, + 0.0515902116894722, + 0.05117034167051315, + 0.05068716034293175, + 0.05020853877067566, + 0.050024863332509995, + 0.05045964941382408, + 0.05089821293950081, + 0.05127076432108879, + 0.04942648857831955, + 0.04764854535460472, + 0.045934561640024185, + 0.04509672522544861, + 0.0445881150662899, + 0.044085241854190826, + 0.04348566383123398, + 0.042738404124975204, + 0.009429430589079857, + 0.009631922468543053, + 0.009882989339530468, + 0.010332385078072548, + 0.01080221589654684, + 0.01122521236538887, + 0.011582008562982082, + 0.011950143612921238, + 0.012166905216872692, + 0.012320658192038536, + 0.012476355768740177, + 0.0133232232183218, + 0.014270481653511524, + 0.015135113149881363, + 0.015278206206858158, + 0.01542265247553587, + 0.015491477213799953, + 0.015430199913680553, + 0.015369164757430553, + 0.015616052784025669, + 0.016117682680487633, + 0.016635427251458168, + 0.017208505421876907, + 0.017816007137298584, + 0.018444953486323357, + 0.0190111193805933, + 0.019583726301789284, + 0.020167771726846695, + 0.020573677495121956, + 0.020987752825021744, + 0.02139057219028473, + 0.021691950038075447, + 0.021997570991516113, + 0.022320030257105827, + 0.02268296107649803, + 0.0230517890304327, + 0.023576173931360245, + 0.02439325861632824, + 0.025238661095499992, + 0.026327870786190033, + 0.02776300720870495, + 0.029276372864842415, + 0.029894212260842323, + 0.02951810322701931, + 0.029146729037165642, + 0.029384303838014603, + 0.030169397592544556, + 0.030975470319390297, + 0.031245989724993706, + 0.031081348657608032, + 0.030917571857571602, + 0.031127361580729485, + 0.031627487391233444, + 0.03213564679026604, + 0.03285883739590645, + 0.03376546874642372, + 0.03469711169600487, + 0.03525129333138466, + 0.03546259552240372, + 0.03567516803741455, + 0.03633692115545273, + 0.03748466074466705, + 0.03866865485906601, + 0.03941555321216583, + 0.03955717012286186, + 0.03969930112361908, + 0.04012148454785347, + 0.041057635098695755, + 0.042015623301267624, + 0.04320408031344414, + 0.04502333700656891, + 0.04691920429468155, + 0.0487593412399292, + 0.04990916699171066, + 0.05108611285686493, + 0.05223653465509415, + 0.05140695348381996, + 0.05059054493904114, + 0.04978710412979126, + 0.04996529594063759, + 0.05027763545513153, + 0.05059192329645157, + 0.05136680603027344, + 0.05233873426914215, + 0.05332905426621437, + 0.05376497656106949, + 0.05370756983757019, + 0.053650226444005966, + 0.05394626408815384, + 0.05495384335517883, + 0.05598023906350136, + 0.057005465030670166, + 0.05789506435394287, + 0.05879855155944824, + 0.059716131538152695, + 0.059444405138492584, + 0.059016142040491104, + 0.05859095975756645, + 0.05857101082801819, + 0.0587899275124073, + 0.05900966748595238, + 0.05879847705364227, + 0.057818904519081116, + 0.05685565993189812, + 0.05590783432126045, + 0.05496708303689957, + 0.054042164236307144, + 0.053132813423871994, + 0.053222522139549255, + 0.053633641451597214, + 0.05404793098568916, + 0.053735170513391495, + 0.05247098580002785, + 0.006861720699816942, + 0.007012917194515467, + 0.007191081531345844, + 0.007436051964759827, + 0.007689367979764938, + 0.007858969271183014, + 0.00795538630336523, + 0.008052986115217209, + 0.00829439889639616, + 0.008580189198255539, + 0.008872762322425842, + 0.009090950712561607, + 0.009314504452049732, + 0.009549709968268871, + 0.009809163399040699, + 0.01007566787302494, + 0.010404326021671295, + 0.010810283944010735, + 0.011232083663344383, + 0.011593460105359554, + 0.011924037709832191, + 0.012264041230082512, + 0.012382492423057556, + 0.01245267316699028, + 0.01252325065433979, + 0.013118098489940166, + 0.013752060011029243, + 0.014405406080186367, + 0.015005470253527164, + 0.015630530193448067, + 0.016180526465177536, + 0.01643560267984867, + 0.016694698482751846, + 0.017036670818924904, + 0.017531801015138626, + 0.018041323870420456, + 0.01852951943874359, + 0.01898549124598503, + 0.019452683627605438, + 0.01992381550371647, + 0.020399363711476326, + 0.020886264741420746, + 0.021463392302393913, + 0.022113924846053123, + 0.022784173488616943, + 0.023034166544675827, + 0.023027390241622925, + 0.023020615801215172, + 0.023657605051994324, + 0.0246683768928051, + 0.025722336024045944, + 0.026421895250678062, + 0.026935745030641556, + 0.02745959162712097, + 0.028605137020349503, + 0.030135780572891235, + 0.03174832835793495, + 0.03243246674537659, + 0.03254604712128639, + 0.03266003355383873, + 0.03373904898762703, + 0.035556353628635406, + 0.03747154027223587, + 0.03851018100976944, + 0.038720037788152695, + 0.03893103450536728, + 0.03940889611840248, + 0.04021233320236206, + 0.04103215038776398, + 0.04199874401092529, + 0.043219778686761856, + 0.04447631165385246, + 0.045862022787332535, + 0.04757010191679001, + 0.049341797828674316, + 0.0509251244366169, + 0.05080358684062958, + 0.05068233981728554, + 0.05056137964129448, + 0.05234416946768761, + 0.05422559380531311, + 0.056174639612436295, + 0.05705564469099045, + 0.05769869312644005, + 0.05834898352622986, + 0.058929383754730225, + 0.05947142094373703, + 0.060018446296453476, + 0.06106197088956833, + 0.06276721507310867, + 0.06452007591724396, + 0.06610195338726044, + 0.06694110482931137, + 0.06779089570045471, + 0.06865148991346359, + 0.07012810558080673, + 0.07164439558982849, + 0.07319346815347672, + 0.07308114320039749, + 0.07236561179161072, + 0.07165708392858505, + 0.07098675519227982, + 0.07035869359970093, + 0.06973619759082794, + 0.06913015991449356, + 0.06858158856630325, + 0.06803736835718155, + 0.06749746203422546, + 0.06624235212802887, + 0.06489992141723633, + 0.06358467787504196, + 0.06174821779131889, + 0.0595087967813015, + 0.006458621937781572, + 0.0065381452441215515, + 0.006642352323979139, + 0.006780518218874931, + 0.006921557709574699, + 0.00717131095007062, + 0.007478462532162666, + 0.007798769045621157, + 0.007900195196270943, + 0.007990321144461632, + 0.008129277266561985, + 0.008487803861498833, + 0.008862141519784927, + 0.009119629859924316, + 0.009187948890030384, + 0.009256781078875065, + 0.00951574370265007, + 0.009907358326017857, + 0.010315089486539364, + 0.010529524646699429, + 0.01069623976945877, + 0.010865596123039722, + 0.011432113125920296, + 0.012038365006446838, + 0.012616725638508797, + 0.012825322337448597, + 0.013037366792559624, + 0.013301029801368713, + 0.013699140399694443, + 0.014109165407717228, + 0.014480220153927803, + 0.014783404767513275, + 0.015092937275767326, + 0.015420462936162949, + 0.015766289085149765, + 0.01611987128853798, + 0.01644185185432434, + 0.016744116321206093, + 0.017051937058568, + 0.01769038662314415, + 0.018511148169636726, + 0.01936998963356018, + 0.01960543543100357, + 0.019617842510342598, + 0.019630257040262222, + 0.02008063718676567, + 0.02066349796950817, + 0.021263277158141136, + 0.022208383306860924, + 0.02327370084822178, + 0.024390120059251785, + 0.024878066033124924, + 0.02523179166018963, + 0.025590546429157257, + 0.026049308478832245, + 0.02653755247592926, + 0.027034945785999298, + 0.02822968177497387, + 0.02966318465769291, + 0.031169479712843895, + 0.03218267485499382, + 0.03304190933704376, + 0.03392408788204193, + 0.03462105616927147, + 0.03524118661880493, + 0.03587241843342781, + 0.036567606031894684, + 0.03730851039290428, + 0.03806442394852638, + 0.03924925997853279, + 0.04084831848740578, + 0.04251252859830856, + 0.043979447335004807, + 0.045126672834157944, + 0.046303823590278625, + 0.04753188043832779, + 0.04884164035320282, + 0.05018749088048935, + 0.051493383944034576, + 0.052395958453416824, + 0.05331435799598694, + 0.05424885079264641, + 0.05573032423853874, + 0.057257626205682755, + 0.058826785534620285, + 0.06122840195894241, + 0.06392201781272888, + 0.06673412770032883, + 0.06798842549324036, + 0.06820321828126907, + 0.06841869652271271, + 0.06941232830286026, + 0.07163898646831512, + 0.0739370733499527, + 0.07583454251289368, + 0.0753161683678627, + 0.07480133324861526, + 0.07429002225399017, + 0.07474516332149506, + 0.0752996876835823, + 0.07585833221673965, + 0.07618299871683121, + 0.07637444138526917, + 0.07656636089086533, + 0.07642973214387894, + 0.07568757236003876, + 0.0749526098370552, + 0.0741606205701828, + 0.07196272909641266, + 0.06982997059822083, + 0.06776043027639389, + 0.06628890335559845, + 0.06505855172872543, + 0.0036367280408740044, + 0.0037033159751445055, + 0.0038319390732795, + 0.004001893103122711, + 0.004179384559392929, + 0.004336083773523569, + 0.0044954572804272175, + 0.00462632579728961, + 0.004574308171868324, + 0.00452287495136261, + 0.004571221303194761, + 0.00477850204333663, + 0.004995182156562805, + 0.005158031824976206, + 0.005285749211907387, + 0.005416628904640675, + 0.005637817550450563, + 0.005887628998607397, + 0.006146891042590141, + 0.006305803079158068, + 0.006468822713941336, + 0.006621973589062691, + 0.006717645097523928, + 0.006814698223024607, + 0.0069808620028197765, + 0.007282041944563389, + 0.007596215233206749, + 0.00782808568328619, + 0.007966602221131325, + 0.008107569068670273, + 0.008350350894033909, + 0.008663693442940712, + 0.008988793939352036, + 0.009332398883998394, + 0.00969154853373766, + 0.010064519941806793, + 0.010421221144497395, + 0.010783889330923557, + 0.011159178800880909, + 0.011474277824163437, + 0.0117903221398592, + 0.012115072458982468, + 0.01218258123844862, + 0.01224119309335947, + 0.012305604293942451, + 0.012854930944740772, + 0.013428779318928719, + 0.014026988297700882, + 0.014620563015341759, + 0.01523925643414259, + 0.015861129388213158, + 0.016079146414995193, + 0.016300160437822342, + 0.016536181792616844, + 0.017022471874952316, + 0.017523063346743584, + 0.018043577671051025, + 0.018786370754241943, + 0.019559742882847786, + 0.020364949479699135, + 0.02065180242061615, + 0.02093515545129776, + 0.021222395822405815, + 0.022591017186641693, + 0.024135790765285492, + 0.025786196812987328, + 0.02655765227973461, + 0.02718578837811947, + 0.027828780934214592, + 0.028918275609612465, + 0.03018810600042343, + 0.031513698399066925, + 0.032832805067300797, + 0.034172262996435165, + 0.03556637093424797, + 0.037035297602415085, + 0.038581252098083496, + 0.04019174352288246, + 0.04204356297850609, + 0.04426691681146622, + 0.0466078445315361, + 0.04915481433272362, + 0.052133552730083466, + 0.055292803794145584, + 0.0585857592523098, + 0.06093898043036461, + 0.06338672339916229, + 0.06593278050422668, + 0.06879366189241409, + 0.07181664556264877, + 0.07497245073318481, + 0.07712118327617645, + 0.07867450267076492, + 0.08025910705327988, + 0.08312834054231644, + 0.08802870661020279, + 0.09321794658899307, + 0.09782863408327103, + 0.0977790579199791, + 0.09772951155900955, + 0.0976799800992012, + 0.10173057019710541, + 0.10650866478681564, + 0.11151118576526642, + 0.11396492272615433, + 0.1146044135093689, + 0.11524749547243118, + 0.1148609146475792, + 0.11202333122491837, + 0.109255850315094, + 0.106556735932827, + 0.10159891843795776, + 0.09679853916168213, + 0.0028571030125021935, + 0.002922013634815812, + 0.0029972612392157316, + 0.0030754904728382826, + 0.0031678536906838417, + 0.003325540805235505, + 0.003491077572107315, + 0.003605249570682645, + 0.0036407187581062317, + 0.0036765369586646557, + 0.0038091172464191914, + 0.003998389467597008, + 0.004197066184133291, + 0.0043542818166315556, + 0.004510606173425913, + 0.0046617682091891766, + 0.004712939728051424, + 0.004764673765748739, + 0.004837929271161556, + 0.004965448286384344, + 0.005096328444778919, + 0.005242025479674339, + 0.005405410658568144, + 0.0055738878436386585, + 0.005693565588444471, + 0.005782959517091513, + 0.0058737583458423615, + 0.0059654670767486095, + 0.006058452185243368, + 0.0061528864316642284, + 0.006394685246050358, + 0.006663249805569649, + 0.006941778585314751, + 0.0071154432371258736, + 0.007293452508747578, + 0.007494453340768814, + 0.007860343903303146, + 0.008244097232818604, + 0.008583955466747284, + 0.008661279454827309, + 0.008739299140870571, + 0.008913041092455387, + 0.00938503909856081, + 0.009882031008601189, + 0.010299156419932842, + 0.010478097945451736, + 0.010660149157047272, + 0.010837672278285027, + 0.01100219413638115, + 0.011169214732944965, + 0.011408122256398201, + 0.011789506301283836, + 0.012183640152215958, + 0.012613996863365173, + 0.013106212019920349, + 0.013617632910609245, + 0.014042814262211323, + 0.014249985106289387, + 0.014460212551057339, + 0.014829296618700027, + 0.01562312338501215, + 0.016459446400403976, + 0.017206678166985512, + 0.01751995086669922, + 0.01783892698585987, + 0.018246684223413467, + 0.019130844622850418, + 0.02005784958600998, + 0.021015724167227745, + 0.021814730018377304, + 0.02264411188662052, + 0.02350502647459507, + 0.024952225387096405, + 0.026512978598475456, + 0.028171353042125702, + 0.030014317482709885, + 0.03199468553066254, + 0.03410572186112404, + 0.03623441606760025, + 0.03843947872519493, + 0.04077873378992081, + 0.04360232874751091, + 0.04694007709622383, + 0.05053333565592766, + 0.05439087375998497, + 0.05852218344807625, + 0.06296729296445847, + 0.06722720712423325, + 0.06900434195995331, + 0.07082846015691757, + 0.07270079851150513, + 0.07421699911355972, + 0.07574377208948135, + 0.07730196416378021, + 0.07999271154403687, + 0.08322305977344513, + 0.08658386021852493, + 0.09197474271059036, + 0.10000835359096527, + 0.10874368250370026, + 0.116676464676857, + 0.11883961409330368, + 0.1210428774356842, + 0.12328698486089706, + 0.12951581180095673, + 0.13643574714660645, + 0.1437254101037979, + 0.14595049619674683, + 0.14482446014881134, + 0.14370709657669067, + 0.14071525633335114, + 0.13338300585746765, + 0.12643280625343323, + 0.004138567019253969, + 0.004158058203756809, + 0.004277869127690792, + 0.0044011324644088745, + 0.004465778823941946, + 0.004466925282031298, + 0.004468072205781937, + 0.004632634110748768, + 0.0048617091961205006, + 0.005102111492305994, + 0.0051993620581924915, + 0.005296813789755106, + 0.005390590988099575, + 0.005465680733323097, + 0.0055418168194592, + 0.005611271131783724, + 0.0056710331700742245, + 0.005731432233005762, + 0.005883502308279276, + 0.0060975635424256325, + 0.006319413892924786, + 0.006547191645950079, + 0.006782619748264551, + 0.007026514038443565, + 0.007168402895331383, + 0.0073086852207779884, + 0.007450907025486231, + 0.007589153945446014, + 0.007729966193437576, + 0.007873429916799068, + 0.008019681088626385, + 0.008168648928403854, + 0.008315719664096832, + 0.008456765674054623, + 0.0086002042517066, + 0.008770620450377464, + 0.00897485762834549, + 0.009183850139379501, + 0.00949991773813963, + 0.00992010161280632, + 0.010358869098126888, + 0.010707615874707699, + 0.010993142612278461, + 0.01128628384321928, + 0.011607805266976357, + 0.011949972249567509, + 0.012302226386964321, + 0.012518023140728474, + 0.012668078765273094, + 0.012819933705031872, + 0.013199565932154655, + 0.013693252578377724, + 0.014205402694642544, + 0.014249730855226517, + 0.014084828086197376, + 0.013921832665801048, + 0.014265641570091248, + 0.014871794730424881, + 0.01550370454788208, + 0.016508731991052628, + 0.01778840273618698, + 0.01916726864874363, + 0.0196668803691864, + 0.019502747803926468, + 0.01933998242020607, + 0.0197075754404068, + 0.02059357613325119, + 0.021519409492611885, + 0.022572487592697144, + 0.023795289918780327, + 0.02508433349430561, + 0.0262504480779171, + 0.02706322818994522, + 0.027901174500584602, + 0.028933217748999596, + 0.030681412667036057, + 0.032535236328840256, + 0.03450234234333038, + 0.03660701587796211, + 0.038840074092149734, + 0.041209351271390915, + 0.04386048763990402, + 0.04669656604528427, + 0.049716025590896606, + 0.051769986748695374, + 0.053481169044971466, + 0.05524890497326851, + 0.057998690754175186, + 0.06171339750289917, + 0.06566602736711502, + 0.06995788216590881, + 0.07471484690904617, + 0.07979527115821838, + 0.08491433411836624, + 0.08758063614368439, + 0.09033066034317017, + 0.09316703677177429, + 0.09723374247550964, + 0.1016790047287941, + 0.10632748901844025, + 0.11012068390846252, + 0.1132904514670372, + 0.116551473736763, + 0.12028071284294128, + 0.12500423192977905, + 0.12991324067115784, + 0.13498009741306305, + 0.13341712951660156, + 0.1318722516298294, + 0.13034527003765106, + 0.12690071761608124, + 0.12268740683794022, + 0.11861398816108704, + 0.004474553279578686, + 0.004657533019781113, + 0.004909782204777002, + 0.005175693891942501, + 0.005293354392051697, + 0.005389816127717495, + 0.005479306448251009, + 0.005512104835361242, + 0.005545100662857294, + 0.005620914977043867, + 0.005770426709204912, + 0.005923915188759565, + 0.006040601525455713, + 0.0061323270201683044, + 0.006225444842129946, + 0.0063487086445093155, + 0.006481049116700888, + 0.006617083214223385, + 0.006831900682300329, + 0.007053690496832132, + 0.007246927358210087, + 0.007294181268662214, + 0.007341742981225252, + 0.0074780466966331005, + 0.007780822459608316, + 0.008095857687294483, + 0.008283998817205429, + 0.008340091444551945, + 0.008396564982831478, + 0.008521645329892635, + 0.008687702938914299, + 0.008856996893882751, + 0.00911936815828085, + 0.009419339708983898, + 0.009729179553687572, + 0.009902290999889374, + 0.010053900070488453, + 0.010207831859588623, + 0.010372940450906754, + 0.010541272349655628, + 0.010713495314121246, + 0.011008651927113533, + 0.011311939917504787, + 0.01161497924476862, + 0.011791049502789974, + 0.011969788931310177, + 0.012156818993389606, + 0.012400522828102112, + 0.0126491142436862, + 0.012909868732094765, + 0.013233380392193794, + 0.013564998283982277, + 0.01393919438123703, + 0.014598732814192772, + 0.015289477072656155, + 0.01597113162279129, + 0.01629025489091873, + 0.01661575585603714, + 0.016928989440202713, + 0.016979478299617767, + 0.017030121758580208, + 0.017092742025852203, + 0.017899703234434128, + 0.018744761124253273, + 0.019629713147878647, + 0.020331595093011856, + 0.021046116948127747, + 0.02178574725985527, + 0.02245323918759823, + 0.02312537655234337, + 0.0238176342099905, + 0.024746010079979897, + 0.025780582800507545, + 0.026858409866690636, + 0.028593193739652634, + 0.03080710582435131, + 0.03319243714213371, + 0.03510730713605881, + 0.03646992892026901, + 0.03788544237613678, + 0.040052782744169235, + 0.043734341859817505, + 0.04775429889559746, + 0.05162057653069496, + 0.053289785981178284, + 0.05501297116279602, + 0.05679188668727875, + 0.06056394428014755, + 0.06460876017808914, + 0.06892372667789459, + 0.07227141410112381, + 0.0754171833395958, + 0.07869987189769745, + 0.08216908574104309, + 0.08582776039838791, + 0.08964934945106506, + 0.0932728499174118, + 0.09619743376970291, + 0.09921371191740036, + 0.10239537805318832, + 0.10714667290449142, + 0.1121184229850769, + 0.11732088029384613, + 0.12010961025953293, + 0.12214874476194382, + 0.12422250211238861, + 0.1254471242427826, + 0.12567202746868134, + 0.1258973330259323, + 0.12602660059928894, + 0.12560468912124634, + 0.12518419325351715, + 0.12476509809494019, + 0.003810666734352708, + 0.003924582619220018, + 0.004041904117912054, + 0.004172074142843485, + 0.004327812697738409, + 0.004489365499466658, + 0.004651701543480158, + 0.004815862979739904, + 0.0049858177080750465, + 0.005151266697794199, + 0.005319815129041672, + 0.005495256744325161, + 0.0057037039659917355, + 0.005920058581978083, + 0.0060615562833845615, + 0.005976251792162657, + 0.005892147310078144, + 0.005933438893407583, + 0.006122824735939503, + 0.006318254861980677, + 0.00640807906165719, + 0.006438244134187698, + 0.006468550767749548, + 0.006758850067853928, + 0.007125280797481537, + 0.007511578034609556, + 0.007464961614459753, + 0.0074035655707120895, + 0.007367875427007675, + 0.0075562018901109695, + 0.007749342359602451, + 0.007924423553049564, + 0.008021418936550617, + 0.00811960268765688, + 0.008222943171858788, + 0.008335934020578861, + 0.008450477384030819, + 0.008617608807981014, + 0.008862936869263649, + 0.0091152498498559, + 0.009381802752614021, + 0.009663962759077549, + 0.009954608045518398, + 0.010253855027258396, + 0.010561973787844181, + 0.010879352688789368, + 0.01120766717940569, + 0.011546963825821877, + 0.011896532028913498, + 0.012025507166981697, + 0.011998606845736504, + 0.01197176706045866, + 0.012074061669409275, + 0.012265662662684917, + 0.01246030442416668, + 0.012739510275423527, + 0.01308449823409319, + 0.013438829220831394, + 0.013723879121243954, + 0.013950583525002003, + 0.01418103277683258, + 0.014701761305332184, + 0.015535683371126652, + 0.01641690731048584, + 0.017171066254377365, + 0.01772969774901867, + 0.01830650493502617, + 0.01879713125526905, + 0.019111918285489082, + 0.019431978464126587, + 0.01991196535527706, + 0.02085576392710209, + 0.021844295784831047, + 0.02297210320830345, + 0.024735068902373314, + 0.026633327826857567, + 0.02866947278380394, + 0.030170803889632225, + 0.03175074979662895, + 0.03341343253850937, + 0.034609656780958176, + 0.035756371915340424, + 0.036941077560186386, + 0.03890644758939743, + 0.041330933570861816, + 0.04390650987625122, + 0.04668572172522545, + 0.04968614876270294, + 0.05287941172719002, + 0.05626773461699486, + 0.05984769016504288, + 0.06365541368722916, + 0.06770379841327667, + 0.07198852300643921, + 0.07654441893100739, + 0.08138862997293472, + 0.08653447777032852, + 0.09200461208820343, + 0.09782052785158157, + 0.10302408784627914, + 0.10774261504411697, + 0.11267725378274918, + 0.1189396008849144, + 0.12837186455726624, + 0.13855212926864624, + 0.14953970909118652, + 0.15556427836418152, + 0.1618223786354065, + 0.16833223402500153, + 0.1707460582256317, + 0.17118197679519653, + 0.1716189980506897, + 0.16975197196006775, + 0.01277695968747139, + 0.01282014511525631, + 0.012863477692008018, + 0.01309087872505188, + 0.013432130217552185, + 0.013782275840640068, + 0.014314194209873676, + 0.014887556433677673, + 0.01541469618678093, + 0.015541506931185722, + 0.015669362619519234, + 0.01592397876083851, + 0.016396556049585342, + 0.016883159056305885, + 0.017164094373583794, + 0.017297936603426933, + 0.01743282377719879, + 0.017787054181098938, + 0.018206577748060226, + 0.01863599568605423, + 0.01978258416056633, + 0.021015556529164314, + 0.02200009860098362, + 0.021181002259254456, + 0.0203924011439085, + 0.020045636221766472, + 0.020671619102358818, + 0.021317146718502045, + 0.021801043301820755, + 0.02206166461110115, + 0.02232540026307106, + 0.022537972778081894, + 0.022709829732775688, + 0.022882994264364243, + 0.023229561746120453, + 0.023669270798563957, + 0.024117305874824524, + 0.0247715562582016, + 0.02550971694290638, + 0.026269875466823578, + 0.026417989283800125, + 0.026435919106006622, + 0.026453860104084015, + 0.02737550437450409, + 0.028454899787902832, + 0.029576856642961502, + 0.030121179297566414, + 0.030623063445091248, + 0.03113330900669098, + 0.03200901299715042, + 0.03293072059750557, + 0.03387896344065666, + 0.03470095619559288, + 0.035534825176000595, + 0.03638872504234314, + 0.036065250635147095, + 0.03567012399435043, + 0.035279322415590286, + 0.035559430718421936, + 0.03590737283229828, + 0.036258723586797714, + 0.03684232011437416, + 0.037471190094947815, + 0.03811079263687134, + 0.039741724729537964, + 0.041694872081279755, + 0.04374401271343231, + 0.044522594660520554, + 0.04479621723294258, + 0.045071523636579514, + 0.04521208256483078, + 0.04527217522263527, + 0.045332346111536026, + 0.045447684824466705, + 0.04561571404337883, + 0.0457843579351902, + 0.046285949647426605, + 0.047342780977487564, + 0.04842374101281166, + 0.04958248510956764, + 0.05094941332936287, + 0.05235402658581734, + 0.05367973446846008, + 0.0533207468688488, + 0.052964165806770325, + 0.052609965205192566, + 0.05311335623264313, + 0.053741127252578735, + 0.05437631532549858, + 0.05454964190721512, + 0.054499391466379166, + 0.054449185729026794, + 0.05489018186926842, + 0.05593402683734894, + 0.05699773132801056, + 0.057638123631477356, + 0.05668143555521965, + 0.055740632116794586, + 0.054815441370010376, + 0.05533815547823906, + 0.05593040585517883, + 0.05652900040149689, + 0.05584181100130081, + 0.054577142000198364, + 0.05334111303091049, + 0.05219716578722, + 0.05117712914943695, + 0.05017701908946037, + 0.04921998083591461, + 0.04856998100876808, + 0.04792856052517891, + 0.04729561507701874, + 0.046553175896406174, + 0.011541948653757572, + 0.011905605904757977, + 0.012280200608074665, + 0.012606742791831493, + 0.012690872885286808, + 0.012775564566254616, + 0.012976186349987984, + 0.013321387581527233, + 0.013675771653652191, + 0.01471642591059208, + 0.016157550737261772, + 0.017739800736308098, + 0.01756903901696205, + 0.01726720668375492, + 0.01697418838739395, + 0.016707174479961395, + 0.016444362699985504, + 0.01652851700782776, + 0.017291370779275894, + 0.018089432269334793, + 0.018622057512402534, + 0.018894782289862633, + 0.01917150244116783, + 0.019590340554714203, + 0.02008102834224701, + 0.02058400586247444, + 0.0213269405066967, + 0.02214038372039795, + 0.022984853014349937, + 0.02243688330054283, + 0.02187342755496502, + 0.02140405960381031, + 0.021679233759641647, + 0.021957943215966225, + 0.022303937003016472, + 0.022915396839380264, + 0.023543622344732285, + 0.023945169523358345, + 0.02374669350683689, + 0.023549862205982208, + 0.02363026700913906, + 0.024218935519456863, + 0.024822266772389412, + 0.025453390553593636, + 0.02611944079399109, + 0.026802919805049896, + 0.027598213404417038, + 0.028537696227431297, + 0.029509160667657852, + 0.030273884534835815, + 0.030778752639889717, + 0.03129203990101814, + 0.03146853670477867, + 0.03125729784369469, + 0.031047476455569267, + 0.03148054704070091, + 0.03271612524986267, + 0.03400019183754921, + 0.035085197538137436, + 0.03585847467184067, + 0.036648791283369064, + 0.037210799753665924, + 0.03737173601984978, + 0.037533365190029144, + 0.03795063495635986, + 0.038948845118284225, + 0.039973314851522446, + 0.04092001914978027, + 0.04153027758002281, + 0.04214964061975479, + 0.04275854676961899, + 0.04324193671345711, + 0.04373079165816307, + 0.04423099383711815, + 0.045222461223602295, + 0.046236153692007065, + 0.047272566705942154, + 0.049200307577848434, + 0.05133434757590294, + 0.05356095731258392, + 0.054014310240745544, + 0.05377223342657089, + 0.05353124067187309, + 0.05382351949810982, + 0.054551031440496445, + 0.05528837814927101, + 0.05608310550451279, + 0.05697251856327057, + 0.05787603557109833, + 0.058792658150196075, + 0.0597173236310482, + 0.060656532645225525, + 0.06161050871014595, + 0.061282478272914886, + 0.06086926907300949, + 0.060458846390247345, + 0.05996282026171684, + 0.05943223461508751, + 0.058906346559524536, + 0.05827749893069267, + 0.0575164370238781, + 0.05676530301570892, + 0.05603937804698944, + 0.05540604889392853, + 0.05477987602353096, + 0.05416078492999077, + 0.05356840789318085, + 0.0529857762157917, + 0.05240948125720024, + 0.05152449011802673, + 0.05039297044277191, + 0.04928630217909813, + 0.04813610762357712, + 0.01160263642668724, + 0.011890359222888947, + 0.01215034257620573, + 0.012416008859872818, + 0.012789401225745678, + 0.013198134489357471, + 0.013618480414152145, + 0.014033124782145023, + 0.014460393227636814, + 0.015060513280332088, + 0.01605207845568657, + 0.01710892841219902, + 0.017565704882144928, + 0.01747717522084713, + 0.017389090731739998, + 0.017320722341537476, + 0.01725882850587368, + 0.017197158187627792, + 0.017586614936590195, + 0.018008362501859665, + 0.01841932162642479, + 0.018700581043958664, + 0.018986135721206665, + 0.019332360476255417, + 0.019821006804704666, + 0.020322002470493317, + 0.02104916237294674, + 0.02208002842962742, + 0.023161377757787704, + 0.02345059998333454, + 0.023139530792832375, + 0.022832587361335754, + 0.023100998252630234, + 0.02363055944442749, + 0.024172257632017136, + 0.024744277819991112, + 0.02533455193042755, + 0.025938907638192177, + 0.02599499747157097, + 0.025974713265895844, + 0.02595444582402706, + 0.02631496824324131, + 0.02670239843428135, + 0.027095533907413483, + 0.027768699452280998, + 0.02845926396548748, + 0.029143650084733963, + 0.029125787317752838, + 0.029107937589287758, + 0.029100440442562103, + 0.029292821884155273, + 0.02948647551238537, + 0.029734166339039803, + 0.031011158600449562, + 0.03234299644827843, + 0.03368833288550377, + 0.033817108720541, + 0.03394637629389763, + 0.034076109528541565, + 0.03416312858462334, + 0.034250371158123016, + 0.034337837249040604, + 0.03510264307260513, + 0.035920947790145874, + 0.03675833344459534, + 0.037389080971479416, + 0.03800027072429657, + 0.0386214442551136, + 0.03953919559717178, + 0.04055323079228401, + 0.0415932722389698, + 0.042436908930540085, + 0.04319863021373749, + 0.04397401958703995, + 0.0446007065474987, + 0.045115478336811066, + 0.04563618451356888, + 0.04663224518299103, + 0.04826970398426056, + 0.04996466636657715, + 0.05134119838476181, + 0.05179004371166229, + 0.052242815494537354, + 0.0526198074221611, + 0.05236373469233513, + 0.05210890993475914, + 0.05185532569885254, + 0.054131366312503815, + 0.056739967316389084, + 0.05947427824139595, + 0.05968337506055832, + 0.05884857103228569, + 0.05802544578909874, + 0.058388423174619675, + 0.06003229692578316, + 0.06172245368361473, + 0.06280270218849182, + 0.06183682009577751, + 0.06088579446077347, + 0.05994938313961029, + 0.059131186455488205, + 0.05832649767398834, + 0.057532764971256256, + 0.05646214634180069, + 0.05528859794139862, + 0.05413943901658058, + 0.053677573800086975, + 0.054238829761743546, + 0.054805949330329895, + 0.05525334179401398, + 0.05421406403183937, + 0.05319433659315109, + 0.052193790674209595, + 0.01057751290500164, + 0.010855128057301044, + 0.01120900921523571, + 0.011574427597224712, + 0.01186493318527937, + 0.012071190401911736, + 0.012281033210456371, + 0.013142136856913567, + 0.014305034652352333, + 0.015570832416415215, + 0.01531906332820654, + 0.015055196359753609, + 0.014909272082149982, + 0.015181208960711956, + 0.015458106994628906, + 0.015900276601314545, + 0.016580156981945038, + 0.01728910580277443, + 0.01780533604323864, + 0.01819770224392414, + 0.018598714843392372, + 0.01859794557094574, + 0.018495194613933563, + 0.018393009901046753, + 0.019336190074682236, + 0.020372828468680382, + 0.021330373361706734, + 0.0212070532143116, + 0.021084444597363472, + 0.0210779570043087, + 0.02144264243543148, + 0.021813640370965004, + 0.022127807140350342, + 0.02232973650097847, + 0.022533509880304337, + 0.023449577391147614, + 0.0253303125500679, + 0.02736189030110836, + 0.028004271909594536, + 0.027343256399035454, + 0.02669784612953663, + 0.026443250477313995, + 0.026442691683769226, + 0.026442132890224457, + 0.026626328006386757, + 0.02691325917840004, + 0.027203280478715897, + 0.027321232482790947, + 0.02735750749707222, + 0.027393827214837074, + 0.02757326140999794, + 0.027816960588097572, + 0.028062812983989716, + 0.028584476560354233, + 0.029239075258374214, + 0.029908668249845505, + 0.030384505167603493, + 0.030766943469643593, + 0.031154194846749306, + 0.03189397230744362, + 0.0328519344329834, + 0.0338386707007885, + 0.03448405861854553, + 0.034880541265010834, + 0.03528158366680145, + 0.036209315061569214, + 0.03766360506415367, + 0.03917631134390831, + 0.04001455008983612, + 0.03990725055336952, + 0.039800241589546204, + 0.040386367589235306, + 0.042455822229385376, + 0.04463132098317146, + 0.04641075059771538, + 0.04629022628068924, + 0.046170011162757874, + 0.04614290967583656, + 0.04741481691598892, + 0.04872177913784981, + 0.05006476864218712, + 0.0501573421061039, + 0.05012515187263489, + 0.05009298026561737, + 0.05099904164671898, + 0.05226892605423927, + 0.05357043072581291, + 0.054634954780340195, + 0.05549047514796257, + 0.056359387934207916, + 0.05746582895517349, + 0.05905551090836525, + 0.06068916246294975, + 0.06221463531255722, + 0.06243171915411949, + 0.06264955550432205, + 0.0628681555390358, + 0.06309228390455246, + 0.06331801414489746, + 0.06354454904794693, + 0.064243383705616, + 0.06528166681528091, + 0.0663367360830307, + 0.06613638997077942, + 0.06316518783569336, + 0.06032746657729149, + 0.05763465538620949, + 0.058368079364299774, + 0.059110838919878006, + 0.059863053262233734, + 0.05842849612236023, + 0.05606553331017494, + 0.053798139095306396, + 0.009763747453689575, + 0.010071959346532822, + 0.010294039733707905, + 0.010516499169170856, + 0.010777393355965614, + 0.0111632589250803, + 0.01156293973326683, + 0.011880089528858662, + 0.012099879793822765, + 0.012323737144470215, + 0.012588159181177616, + 0.012872617691755295, + 0.01316350419074297, + 0.013498185202479362, + 0.013843545690178871, + 0.014202910475432873, + 0.014600538648664951, + 0.015009299851953983, + 0.015381296165287495, + 0.01567036472260952, + 0.015964869409799576, + 0.016183972358703613, + 0.016332246363162994, + 0.016481881961226463, + 0.016833046451210976, + 0.017285902053117752, + 0.017750941216945648, + 0.018190762028098106, + 0.018633663654327393, + 0.019087348133325577, + 0.0194078478962183, + 0.01972777768969536, + 0.020045487210154533, + 0.020272983238101006, + 0.020503060892224312, + 0.02076960913836956, + 0.021207310259342194, + 0.02165423333644867, + 0.02205166593194008, + 0.022278154268860817, + 0.022506970912218094, + 0.0227676834911108, + 0.023096628487110138, + 0.02343032695353031, + 0.02374812215566635, + 0.02403326891362667, + 0.024321839213371277, + 0.024855798110365868, + 0.02578863315284252, + 0.02675647661089897, + 0.027507316321134567, + 0.027903450652956963, + 0.028305290266871452, + 0.02866993099451065, + 0.02897508628666401, + 0.029283486306667328, + 0.029751693829894066, + 0.03048435039818287, + 0.031235050410032272, + 0.03177782520651817, + 0.03190105780959129, + 0.03202476724982262, + 0.03244251012802124, + 0.033594176173210144, + 0.03478672727942467, + 0.036110855638980865, + 0.037812016904354095, + 0.03959331661462784, + 0.04114142805337906, + 0.04067007824778557, + 0.04020413011312485, + 0.039809536188840866, + 0.04180257022380829, + 0.04389538988471031, + 0.04609297588467598, + 0.04656868800520897, + 0.04685703665018082, + 0.047147173434495926, + 0.04802414029836655, + 0.049103979021310806, + 0.05020809918642044, + 0.051892973482608795, + 0.05401398986577988, + 0.056221701204776764, + 0.05756628140807152, + 0.05766192078590393, + 0.05775772035121918, + 0.05812360346317291, + 0.05939338728785515, + 0.060690902173519135, + 0.06200521066784859, + 0.06279447674751282, + 0.0635937973856926, + 0.06440328061580658, + 0.06508271396160126, + 0.06573169678449631, + 0.06638716161251068, + 0.06669894605875015, + 0.06671563535928726, + 0.06673232465982437, + 0.06692896783351898, + 0.06760586053133011, + 0.0682896077632904, + 0.06898026913404465, + 0.06775913387537003, + 0.06653862446546555, + 0.06534009426832199, + 0.06444255262613297, + 0.06368455290794373, + 0.0629354789853096, + 0.0619329996407032, + 0.06049460545182228, + 0.05908961221575737, + 0.009861363098025322, + 0.0099851218983531, + 0.010295534506440163, + 0.010679726488888264, + 0.011074181646108627, + 0.011282148770987988, + 0.011494021862745285, + 0.011759981513023376, + 0.012168535962700844, + 0.012591282837092876, + 0.013024916872382164, + 0.013469761237502098, + 0.013929799199104309, + 0.014144123531877995, + 0.01426802109926939, + 0.014393004588782787, + 0.014787099324166775, + 0.015208415687084198, + 0.015669627115130424, + 0.01632854714989662, + 0.017015177756547928, + 0.01765110157430172, + 0.018130049109458923, + 0.01862199418246746, + 0.018748268485069275, + 0.018457535654306412, + 0.018171312287449837, + 0.018390711396932602, + 0.018935993313789368, + 0.019497444853186607, + 0.020402006804943085, + 0.02146732248365879, + 0.02258826233446598, + 0.02264789305627346, + 0.022523732855916023, + 0.022400252521038055, + 0.023206008598208427, + 0.024091118946671486, + 0.02499285154044628, + 0.02536623552441597, + 0.025745196267962456, + 0.026060400530695915, + 0.02570374310016632, + 0.02535196579992771, + 0.025083106011152267, + 0.025300806388258934, + 0.02552039548754692, + 0.02581970766186714, + 0.02651468850672245, + 0.027228377759456635, + 0.027912108227610588, + 0.028386248275637627, + 0.02886844426393509, + 0.029336245730519295, + 0.029705112800002098, + 0.030078615993261337, + 0.030509553849697113, + 0.031238043680787086, + 0.03198392316699028, + 0.03273225948214531, + 0.03338056057691574, + 0.03404170274734497, + 0.034705426543951035, + 0.03522162511944771, + 0.03574549779295921, + 0.0362771600484848, + 0.037009239196777344, + 0.037758082151412964, + 0.03852207958698273, + 0.0393417626619339, + 0.040183451026678085, + 0.04104313999414444, + 0.04223418980836868, + 0.04354430362582207, + 0.04489505663514137, + 0.04634552076458931, + 0.04787251353263855, + 0.04944981262087822, + 0.05030634254217148, + 0.0504789873957634, + 0.05065222829580307, + 0.050978075712919235, + 0.051572397351264954, + 0.05217364802956581, + 0.05295635759830475, + 0.054523058235645294, + 0.0561361126601696, + 0.057796891778707504, + 0.05828745663166046, + 0.05877245217561722, + 0.059261489659547806, + 0.060698769986629486, + 0.062449343502521515, + 0.0642504096031189, + 0.06475804001092911, + 0.06416429579257965, + 0.06357599794864655, + 0.06333427876234055, + 0.06390891969203949, + 0.06448878347873688, + 0.06506802886724472, + 0.06544452905654907, + 0.06582321971654892, + 0.06620409339666367, + 0.06535554677248001, + 0.06409760564565659, + 0.06286387145519257, + 0.061635565012693405, + 0.06040794774889946, + 0.05920477584004402, + 0.05823015421628952, + 0.05890579894185066, + 0.05958928167819977, + 0.00891874823719263, + 0.008970635943114758, + 0.009171053767204285, + 0.009476562961935997, + 0.009792249649763107, + 0.010210809297859669, + 0.010661340318620205, + 0.011061386205255985, + 0.010984598658978939, + 0.010908343829214573, + 0.011094456538558006, + 0.011763733811676502, + 0.012473384849727154, + 0.013200669549405575, + 0.013951625674962997, + 0.014745300635695457, + 0.01506136730313301, + 0.015248185023665428, + 0.015437318943440914, + 0.015167826786637306, + 0.014895984902977943, + 0.01480777282267809, + 0.015692632645368576, + 0.016630368307232857, + 0.017265526577830315, + 0.017154352739453316, + 0.01704389601945877, + 0.017236491665244102, + 0.017794307321310043, + 0.01837017573416233, + 0.018694443628191948, + 0.018834885209798813, + 0.018976381048560143, + 0.019244713708758354, + 0.01957179419696331, + 0.01990443468093872, + 0.020637545734643936, + 0.02150486409664154, + 0.022408630698919296, + 0.022570008412003517, + 0.022620080038905144, + 0.022670259699225426, + 0.022780198603868484, + 0.022894881665706635, + 0.023010140284895897, + 0.023491784930229187, + 0.023991338908672333, + 0.024500414729118347, + 0.024883124977350235, + 0.025271812453866005, + 0.025674276053905487, + 0.026472020894289017, + 0.027294553816318512, + 0.028140684589743614, + 0.02887880429625511, + 0.029636284336447716, + 0.030413635075092316, + 0.030550116673111916, + 0.030682429671287537, + 0.03081531450152397, + 0.03193189576268196, + 0.0331391915678978, + 0.034392137080430984, + 0.035057760775089264, + 0.035663142800331116, + 0.03627898171544075, + 0.03728252276778221, + 0.03839702531695366, + 0.03954484686255455, + 0.040198247879743576, + 0.0406687892973423, + 0.04114483669400215, + 0.041927751153707504, + 0.042910683900117874, + 0.04391666129231453, + 0.04612515866756439, + 0.049717988818883896, + 0.05359067767858505, + 0.05600983276963234, + 0.05536290258169174, + 0.05472344905138016, + 0.05474395304918289, + 0.05754058435559273, + 0.06048007681965828, + 0.06351181119680405, + 0.06312979757785797, + 0.06275008618831635, + 0.06237264350056648, + 0.06279374659061432, + 0.06339556723833084, + 0.06400315463542938, + 0.06454575061798096, + 0.06504631042480469, + 0.06555073708295822, + 0.06598370522260666, + 0.06629150360822678, + 0.0666007399559021, + 0.06685256958007812, + 0.06667640060186386, + 0.06650068610906601, + 0.06632544100284576, + 0.06696266680955887, + 0.06775034964084625, + 0.06854730099439621, + 0.06713330745697021, + 0.06411060690879822, + 0.061224013566970825, + 0.058923639357089996, + 0.05799947679042816, + 0.057089805603027344, + 0.056194402277469635, + 0.05565759167075157, + 0.05515098571777344, + 0.009864174760878086, + 0.010104969143867493, + 0.010390006005764008, + 0.01072018500417471, + 0.011060857214033604, + 0.011325882747769356, + 0.011573057621717453, + 0.011827216483652592, + 0.012128788977861404, + 0.012438052333891392, + 0.01273435540497303, + 0.0129815973341465, + 0.013233638368546963, + 0.013602610677480698, + 0.01409950852394104, + 0.014614558778703213, + 0.015146207995712757, + 0.01569622941315174, + 0.016266224905848503, + 0.016550147905945778, + 0.016802173107862473, + 0.017063375562429428, + 0.01740310527384281, + 0.017749598249793053, + 0.018038762733340263, + 0.018111707642674446, + 0.018184950575232506, + 0.018361691385507584, + 0.018719429150223732, + 0.019084133207798004, + 0.019443312659859657, + 0.019796175882220268, + 0.020155444741249084, + 0.02060963585972786, + 0.021132973954081535, + 0.021669602021574974, + 0.022355766966938972, + 0.02312392182648182, + 0.02391847036778927, + 0.024054406210780144, + 0.023997804149985313, + 0.02394133433699608, + 0.024328893050551414, + 0.02481008879840374, + 0.025300802662968636, + 0.025471530854701996, + 0.025600126013159752, + 0.02572937123477459, + 0.026668444275856018, + 0.027724282816052437, + 0.028821922838687897, + 0.028832895681262016, + 0.02875157818198204, + 0.02867048978805542, + 0.02943086251616478, + 0.03029036894440651, + 0.031174974516034126, + 0.031925298273563385, + 0.03267446905374527, + 0.0334412157535553, + 0.03415277600288391, + 0.03486684337258339, + 0.035595837980508804, + 0.035751670598983765, + 0.03576057776808739, + 0.03576948493719101, + 0.03660570830106735, + 0.03778846189379692, + 0.03900942578911781, + 0.040127892047166824, + 0.04119408130645752, + 0.042288605123758316, + 0.04344131052494049, + 0.044652558863162994, + 0.045897576957941055, + 0.04713070020079613, + 0.04832472652196884, + 0.049549005925655365, + 0.05104627087712288, + 0.053326450288295746, + 0.05570847541093826, + 0.057940226048231125, + 0.05771171674132347, + 0.057484112679958344, + 0.05725740268826485, + 0.05927406623959541, + 0.061586763709783554, + 0.06398969143629074, + 0.06409825384616852, + 0.06328203529119492, + 0.06247621774673462, + 0.06186160817742348, + 0.061432354152202606, + 0.06100607290863991, + 0.0609317421913147, + 0.061824604868888855, + 0.06273054331541061, + 0.06363733112812042, + 0.0637519434094429, + 0.0638667643070221, + 0.063981793820858, + 0.06324168294668198, + 0.06222373992204666, + 0.06122218444943428, + 0.060449957847595215, + 0.05993880704045296, + 0.059431981295347214, + 0.05883844569325447, + 0.05774189159274101, + 0.056665774434804916, + 0.05560971051454544, + 0.05475484952330589, + 0.05395137891173363, + 0.00906759686768055, + 0.009389657527208328, + 0.009642716497182846, + 0.009816271252930164, + 0.009992950595915318, + 0.010490263812243938, + 0.011122675612568855, + 0.011788753792643547, + 0.011907365173101425, + 0.01202717050909996, + 0.012171578593552113, + 0.012390946969389915, + 0.012614269740879536, + 0.012868370860815048, + 0.01315884105861187, + 0.013455867767333984, + 0.013767777942121029, + 0.014090989716351032, + 0.014421789906919003, + 0.014763358980417252, + 0.015113506466150284, + 0.015481892973184586, + 0.016122737899422646, + 0.016790108755230904, + 0.017394283786416054, + 0.017639318481087685, + 0.01788780279457569, + 0.018188731744885445, + 0.018592365086078644, + 0.019004952162504196, + 0.01931532472372055, + 0.01950128749012947, + 0.019689040258526802, + 0.020152149721980095, + 0.020835520699620247, + 0.02154206857085228, + 0.021690236404538155, + 0.021554920822381973, + 0.021420447155833244, + 0.021585984155535698, + 0.02185618132352829, + 0.022129761055111885, + 0.022889388725161552, + 0.023795684799551964, + 0.02473786659538746, + 0.025200482457876205, + 0.025581348687410355, + 0.025967972353100777, + 0.026090648025274277, + 0.02617705427110195, + 0.026263747364282608, + 0.026763979345560074, + 0.027325835078954697, + 0.02789948508143425, + 0.02856265753507614, + 0.02925192192196846, + 0.02995782159268856, + 0.030716445297002792, + 0.03150013089179993, + 0.032303810119628906, + 0.0328373983502388, + 0.03331635147333145, + 0.03380228951573372, + 0.03487822785973549, + 0.036174703389406204, + 0.03751936927437782, + 0.038343727588653564, + 0.038928769528865814, + 0.03952273726463318, + 0.04016030952334404, + 0.04083160310983658, + 0.041514117270708084, + 0.04251085966825485, + 0.043855439871549606, + 0.0452425479888916, + 0.04667247086763382, + 0.04814569652080536, + 0.0496654212474823, + 0.051219046115875244, + 0.0527699813246727, + 0.05436788126826286, + 0.05594678223133087, + 0.056469209492206573, + 0.05699652060866356, + 0.057528749108314514, + 0.05866703763604164, + 0.059912748634815216, + 0.06118490919470787, + 0.061844151467084885, + 0.06221040338277817, + 0.06257882714271545, + 0.06325726211071014, + 0.06430178135633469, + 0.06536354124546051, + 0.06615009903907776, + 0.06597527116537094, + 0.06580091267824173, + 0.06562701612710953, + 0.06577108800411224, + 0.06592192500829697, + 0.06607310473918915, + 0.06612702459096909, + 0.06614111363887787, + 0.06615520268678665, + 0.0657283142209053, + 0.064706951379776, + 0.06370145082473755, + 0.06265968829393387, + 0.0612398125231266, + 0.05985211208462715, + 0.05849585309624672, + 0.057800669223070145, + 0.05728238448500633, + 0.008255011402070522, + 0.00837765447795391, + 0.008483624085783958, + 0.008573418483138084, + 0.008664162829518318, + 0.008829633705317974, + 0.009019022807478905, + 0.009218721650540829, + 0.009588386863470078, + 0.009972874075174332, + 0.010348846204578876, + 0.010673758573830128, + 0.011008872650563717, + 0.011373337358236313, + 0.011769604869186878, + 0.012179678305983543, + 0.012319812551140785, + 0.012342031113803387, + 0.012364290654659271, + 0.012578574940562248, + 0.012820074334740639, + 0.013066723011434078, + 0.0133252814412117, + 0.01358895655721426, + 0.0139217060059309, + 0.014488056302070618, + 0.015077446587383747, + 0.015517769381403923, + 0.015671411529183388, + 0.015826573595404625, + 0.016070401296019554, + 0.016408395022153854, + 0.01675349846482277, + 0.017243072390556335, + 0.017839275300502777, + 0.018456092104315758, + 0.018895449116826057, + 0.019258825108408928, + 0.019629186019301414, + 0.020100925117731094, + 0.020611625164747238, + 0.021135300397872925, + 0.02146296761929989, + 0.02175522781908512, + 0.02205147035419941, + 0.02246948890388012, + 0.022911235690116882, + 0.023361671715974808, + 0.024014921858906746, + 0.024705808609724045, + 0.025416571646928787, + 0.02585582807660103, + 0.026278071105480194, + 0.026707205921411514, + 0.02721988782286644, + 0.027749445289373398, + 0.028289303183555603, + 0.029076606035232544, + 0.02991456538438797, + 0.030776673927903175, + 0.03135067597031593, + 0.03188173845410347, + 0.03242180123925209, + 0.03332596272230148, + 0.0343480221927166, + 0.03540142625570297, + 0.03613461181521416, + 0.03674710914492607, + 0.0373699814081192, + 0.03861800581216812, + 0.04028024151921272, + 0.042014021426439285, + 0.04308237507939339, + 0.04350099340081215, + 0.04392367973923683, + 0.04476070776581764, + 0.046252768486738205, + 0.047794561833143234, + 0.0494045652449131, + 0.05111980065703392, + 0.052894581109285355, + 0.05470658838748932, + 0.05633458122611046, + 0.0580110140144825, + 0.05973733961582184, + 0.060512837022542953, + 0.061202920973300934, + 0.061900872737169266, + 0.06310320645570755, + 0.06453075259923935, + 0.06599058955907822, + 0.06719774007797241, + 0.06813791394233704, + 0.06909123808145523, + 0.07033684104681015, + 0.07239013910293579, + 0.07450339198112488, + 0.07662367075681686, + 0.07527288794517517, + 0.07394593209028244, + 0.07264236360788345, + 0.07164528220891953, + 0.07075770944356918, + 0.0698811337351799, + 0.06953316181898117, + 0.06980464607477188, + 0.07007720321416855, + 0.07015711814165115, + 0.06914612650871277, + 0.06814970076084137, + 0.06716763228178024, + 0.06548966467380524, + 0.06370672583580017, + 0.00692471070215106, + 0.007158391177654266, + 0.007501470856368542, + 0.007931467145681381, + 0.00838611088693142, + 0.008437013253569603, + 0.008427100256085396, + 0.008467378094792366, + 0.00886442232877016, + 0.009280084632337093, + 0.009635110385715961, + 0.009860251098871231, + 0.010090651921927929, + 0.010235709138214588, + 0.010318521410226822, + 0.010402003303170204, + 0.010830126702785492, + 0.011370997875928879, + 0.011938881129026413, + 0.011953629553318024, + 0.011959411203861237, + 0.012013216502964497, + 0.01232458557933569, + 0.012644024565815926, + 0.013104201294481754, + 0.013879271224141121, + 0.01470018457621336, + 0.01508722547441721, + 0.014927035197615623, + 0.01476854458451271, + 0.014976360835134983, + 0.01545053068548441, + 0.01593971438705921, + 0.01621168479323387, + 0.016387831419706345, + 0.016565892845392227, + 0.01700541563332081, + 0.01752619631588459, + 0.018062928691506386, + 0.01834445260465145, + 0.018590446561574936, + 0.018839741125702858, + 0.019416430965065956, + 0.020034419372677803, + 0.020672079175710678, + 0.02101992256939411, + 0.021367112174630165, + 0.021721752360463142, + 0.02229691669344902, + 0.02288730815052986, + 0.023495269939303398, + 0.02421758696436882, + 0.024962108582258224, + 0.025724345818161964, + 0.026156926527619362, + 0.026596780866384506, + 0.027044033631682396, + 0.02761896885931492, + 0.028207024559378624, + 0.02880759909749031, + 0.030502457171678543, + 0.03235366940498352, + 0.03431723266839981, + 0.03491891175508499, + 0.03536304086446762, + 0.03581282123923302, + 0.03618444874882698, + 0.036541879177093506, + 0.036902837455272675, + 0.037819504737854004, + 0.03896673023700714, + 0.04014875367283821, + 0.041331756860017776, + 0.04252810403704643, + 0.04375908151268959, + 0.044969573616981506, + 0.04615584760904312, + 0.04737341031432152, + 0.04862181469798088, + 0.049900732934474945, + 0.05121329426765442, + 0.05271783843636513, + 0.05494007468223572, + 0.05725598335266113, + 0.059652600437402725, + 0.06109648942947388, + 0.0625753253698349, + 0.06408996134996414, + 0.06497650593519211, + 0.06572785973548889, + 0.06648790836334229, + 0.06825569272041321, + 0.07074905186891556, + 0.0733334869146347, + 0.0752953439950943, + 0.07608150690793991, + 0.07687588036060333, + 0.07745718210935593, + 0.07643643766641617, + 0.07542914897203445, + 0.07443512976169586, + 0.07448181509971619, + 0.07470975071191788, + 0.07493837922811508, + 0.07490190118551254, + 0.07466012239456177, + 0.07441912591457367, + 0.07398131489753723, + 0.07298075407743454, + 0.07199371606111526, + 0.07102002948522568, + 0.07086541503667831, + 0.07077040523290634, + 0.004369821865111589, + 0.004627087619155645, + 0.004677405580878258, + 0.004656009376049042, + 0.00463822903111577, + 0.004791914485394955, + 0.004950691945850849, + 0.005106483586132526, + 0.005244778003543615, + 0.00538681773468852, + 0.005521745886653662, + 0.005649429280310869, + 0.005780065432190895, + 0.005855419673025608, + 0.0059107826091349125, + 0.005966668948531151, + 0.006361424457281828, + 0.006804238073527813, + 0.007220924366265535, + 0.007290112320333719, + 0.007359963376075029, + 0.007576956879347563, + 0.00814348366111517, + 0.008752369321882725, + 0.008975321426987648, + 0.008733060210943222, + 0.008497338742017746, + 0.008531015366315842, + 0.008733614347875118, + 0.008941024541854858, + 0.009285446256399155, + 0.009690779261291027, + 0.01011380460113287, + 0.010428130626678467, + 0.010730285197496414, + 0.011041194200515747, + 0.011188970878720284, + 0.01132985483855009, + 0.011475667357444763, + 0.01172597799450159, + 0.011981748044490814, + 0.012250976637005806, + 0.01260510552674532, + 0.012969470582902431, + 0.01338759995996952, + 0.014098656363785267, + 0.01484747976064682, + 0.015508950687944889, + 0.015560008585453033, + 0.015611234121024609, + 0.01575346849858761, + 0.016318107023835182, + 0.01690298318862915, + 0.017532574012875557, + 0.018300648778676987, + 0.019102372229099274, + 0.01992884837090969, + 0.020732590928673744, + 0.021568749099969864, + 0.022411465644836426, + 0.02307661809027195, + 0.023761510848999023, + 0.02444126270711422, + 0.024750418961048126, + 0.025063488632440567, + 0.025380518287420273, + 0.0264588650316, + 0.027591131627559662, + 0.02877185307443142, + 0.03031022846698761, + 0.03196694701910019, + 0.03371421620249748, + 0.03579412028193474, + 0.03806835040450096, + 0.04048708453774452, + 0.04188699275255203, + 0.04274521768093109, + 0.04362102970480919, + 0.045068200677633286, + 0.047085102647542953, + 0.04919225722551346, + 0.05193992704153061, + 0.05585571005940437, + 0.060066696256399155, + 0.06387992203235626, + 0.06474258750677109, + 0.0656169056892395, + 0.06650303304195404, + 0.06856178492307663, + 0.07069391757249832, + 0.07289235293865204, + 0.0773245245218277, + 0.08269292861223221, + 0.08843404799699783, + 0.09218195825815201, + 0.09406569600105286, + 0.09598793089389801, + 0.09780044853687286, + 0.09928721189498901, + 0.10079658776521683, + 0.10226763039827347, + 0.10159551352262497, + 0.10092780739068985, + 0.10026449710130692, + 0.09930555522441864, + 0.09825198352336884, + 0.09720958769321442, + 0.09560627490282059, + 0.0933045893907547, + 0.09105832129716873, + 0.08868622779846191, + 0.08498799800872803, + 0.08144399523735046, + 0.003941376693546772, + 0.004147458355873823, + 0.004144737962633371, + 0.004132123664021492, + 0.004140941891819239, + 0.004223837982863188, + 0.004308393690735102, + 0.004408667795360088, + 0.004526754841208458, + 0.004648005124181509, + 0.004762081429362297, + 0.004874849691987038, + 0.0049902889877557755, + 0.0051256269216537476, + 0.0052656386978924274, + 0.005423285998404026, + 0.0056638410314917564, + 0.005915066227316856, + 0.006131727248430252, + 0.006268495228141546, + 0.006408313289284706, + 0.006542182993143797, + 0.006670490372925997, + 0.00680131372064352, + 0.0069898031651973724, + 0.007209536153823137, + 0.007436176761984825, + 0.007642670534551144, + 0.007849237881600857, + 0.00806138850748539, + 0.008357470855116844, + 0.008667745627462864, + 0.008984618820250034, + 0.009249302558600903, + 0.009521784260869026, + 0.009830060414969921, + 0.010288958437740803, + 0.010769277811050415, + 0.011108907870948315, + 0.01097104325890541, + 0.010834888555109501, + 0.010909872129559517, + 0.01145897526293993, + 0.012035717256367207, + 0.012527238577604294, + 0.01283192913979292, + 0.01314403023570776, + 0.013525607995688915, + 0.014017327688634396, + 0.01452692411839962, + 0.014886833727359772, + 0.015007569454610348, + 0.01512928493320942, + 0.015373642556369305, + 0.015806330367922783, + 0.01625119522213936, + 0.01671922393143177, + 0.017218321561813354, + 0.017732316628098488, + 0.018283851444721222, + 0.018895670771598816, + 0.019527964293956757, + 0.020260149613022804, + 0.021218128502368927, + 0.022221405059099197, + 0.023227201774716377, + 0.024114632979035378, + 0.02503596805036068, + 0.02600846253335476, + 0.02712666243314743, + 0.028292937204241753, + 0.029522178694605827, + 0.0312819704413414, + 0.03314666077494621, + 0.03512250632047653, + 0.03719611465930939, + 0.039389897137880325, + 0.04171306639909744, + 0.04374589025974274, + 0.04573947936296463, + 0.04782392084598541, + 0.050344839692115784, + 0.053235363215208054, + 0.0562918484210968, + 0.059136390686035156, + 0.06158433109521866, + 0.06413360685110092, + 0.06693967431783676, + 0.07038988918066025, + 0.07401794195175171, + 0.07783577591180801, + 0.0819881483912468, + 0.08636204898357391, + 0.0909692794084549, + 0.09321451932191849, + 0.09481806308031082, + 0.09644921123981476, + 0.09895592927932739, + 0.10227012634277344, + 0.10569530725479126, + 0.1087493970990181, + 0.11058037728071213, + 0.11244218796491623, + 0.11433534324169159, + 0.11177300661802292, + 0.1092195138335228, + 0.10672437399625778, + 0.10489843785762787, + 0.10338187217712402, + 0.10188723355531693, + 0.09911107271909714, + 0.09421743452548981, + 0.08956541866064072, + 0.005459161940962076, + 0.005542844999581575, + 0.005782263353466988, + 0.00603202311322093, + 0.00623167073354125, + 0.006373376119881868, + 0.006518304347991943, + 0.006646091118454933, + 0.006769379135221243, + 0.006894954014569521, + 0.006982351187616587, + 0.007070422638207674, + 0.007322707679122686, + 0.008232605643570423, + 0.009255566634237766, + 0.009749879129230976, + 0.00940689630806446, + 0.009075978770852089, + 0.008941936306655407, + 0.008923554793000221, + 0.00890521053224802, + 0.00902077928185463, + 0.009172317571938038, + 0.00932640116661787, + 0.009319528937339783, + 0.009306199848651886, + 0.009328169748187065, + 0.009645964950323105, + 0.00997458677738905, + 0.010333641432225704, + 0.010769251734018326, + 0.011223225854337215, + 0.011597409844398499, + 0.011799518950283527, + 0.012005148455500603, + 0.012165289372205734, + 0.012267539277672768, + 0.012370649725198746, + 0.012546125799417496, + 0.01278773508965969, + 0.01303399633616209, + 0.01345030963420868, + 0.013995113782584667, + 0.014561984688043594, + 0.014927913434803486, + 0.015179969370365143, + 0.015436279587447643, + 0.015588527545332909, + 0.015691163018345833, + 0.015794474631547928, + 0.016110308468341827, + 0.01652766764163971, + 0.016955837607383728, + 0.01754431240260601, + 0.018221423029899597, + 0.018924666568636894, + 0.019344879314303398, + 0.019624708220362663, + 0.019908584654331207, + 0.02074730396270752, + 0.021948905661702156, + 0.02322010137140751, + 0.023952895775437355, + 0.024277949705719948, + 0.02460741624236107, + 0.025142056867480278, + 0.025879306718707085, + 0.026638178154826164, + 0.02782909944653511, + 0.029643911868333817, + 0.03157707303762436, + 0.03335902839899063, + 0.03465060517191887, + 0.03599219024181366, + 0.037585653364658356, + 0.040060464292764664, + 0.042698223143815994, + 0.045381098985672, + 0.0463859960436821, + 0.047413140535354614, + 0.04846303164958954, + 0.05043001100420952, + 0.05256908759474754, + 0.05479889363050461, + 0.05722220987081528, + 0.05978984385728836, + 0.062472689896821976, + 0.06561753153800964, + 0.06922406703233719, + 0.07302883267402649, + 0.07629421353340149, + 0.07815704494714737, + 0.08006534725427628, + 0.08207717537879944, + 0.08464700728654861, + 0.08729730546474457, + 0.09003058820962906, + 0.09335379302501678, + 0.09688761830329895, + 0.10055520385503769, + 0.10187315195798874, + 0.1014997661113739, + 0.1011277586221695, + 0.10026000440120697, + 0.0982981026172638, + 0.09637458622455597, + 0.09449701011180878, + 0.09423854202032089, + 0.09398078173398972, + 0.09372372180223465, + 0.09155210107564926, + 0.08858050405979156, + 0.08570536226034164, + 0.006498143542557955, + 0.006706750486046076, + 0.006978979799896479, + 0.0072622597217559814, + 0.007366482634097338, + 0.0074287098832428455, + 0.007505045738071203, + 0.007759420201182365, + 0.00802241638302803, + 0.008280260488390923, + 0.00851504411548376, + 0.008756485767662525, + 0.008943343535065651, + 0.00908186286687851, + 0.009222528897225857, + 0.009351937100291252, + 0.009478761814534664, + 0.009607307612895966, + 0.009722620248794556, + 0.009838555939495564, + 0.009944387711584568, + 0.009975830093026161, + 0.010007372125983238, + 0.010180285200476646, + 0.01070373971015215, + 0.01125410944223404, + 0.011498188599944115, + 0.011336605064570904, + 0.011177292093634605, + 0.011330784298479557, + 0.011721057817339897, + 0.012124773114919662, + 0.012502063997089863, + 0.012872905470430851, + 0.013254746794700623, + 0.013280725106596947, + 0.013213736936450005, + 0.013147084973752499, + 0.013777066022157669, + 0.014540417119860649, + 0.015346065163612366, + 0.015108124352991581, + 0.014815745875239372, + 0.014529025182127953, + 0.014943970367312431, + 0.015372518450021744, + 0.015812024474143982, + 0.016222452744841576, + 0.01664353534579277, + 0.01706492342054844, + 0.017288556322455406, + 0.017515121027827263, + 0.01778934895992279, + 0.018950965255498886, + 0.020188432186841965, + 0.021450547501444817, + 0.02115521766245365, + 0.020863953977823257, + 0.020577123388648033, + 0.020893244072794914, + 0.02121422067284584, + 0.02154012955725193, + 0.02271687425673008, + 0.024005357176065445, + 0.025366919115185738, + 0.026040896773338318, + 0.02663041092455387, + 0.027233270928263664, + 0.028354182839393616, + 0.029655516147613525, + 0.031016571447253227, + 0.031862951815128326, + 0.03247680515050888, + 0.033102478832006454, + 0.03479773551225662, + 0.03741912171244621, + 0.04023797810077667, + 0.04256586357951164, + 0.04409567266702652, + 0.045680463314056396, + 0.047548968344926834, + 0.0500933974981308, + 0.052773989737033844, + 0.0555499829351902, + 0.05807064473628998, + 0.06070568785071373, + 0.06346029043197632, + 0.06637507677078247, + 0.06942690908908844, + 0.07261905074119568, + 0.07569722086191177, + 0.07879632711410522, + 0.0820223018527031, + 0.08460608124732971, + 0.086433045566082, + 0.0882994532585144, + 0.09003540128469467, + 0.09125848114490509, + 0.09249816834926605, + 0.09375470131635666, + 0.0961650088429451, + 0.09866420179605484, + 0.10122833400964737, + 0.1000862643122673, + 0.09737071394920349, + 0.09472884237766266, + 0.09264427423477173, + 0.09133484214544296, + 0.09004391729831696, + 0.08865487575531006, + 0.08593111485242844, + 0.08329104632139206, + 0.0807320848107338, + 0.004739311058074236, + 0.00486228009685874, + 0.005001123063266277, + 0.005131428129971027, + 0.005212381482124329, + 0.005294612608850002, + 0.0053855436854064465, + 0.005487049464136362, + 0.0055904695764184, + 0.005793995689600706, + 0.006048860494047403, + 0.006314936093986034, + 0.006354122422635555, + 0.006376073695719242, + 0.00639038672670722, + 0.006359391380101442, + 0.006328546907752752, + 0.0063834600150585175, + 0.006606979761272669, + 0.006838326342403889, + 0.00701699685305357, + 0.007144710514694452, + 0.007274748757481575, + 0.007386069279164076, + 0.007489647716283798, + 0.007594678085297346, + 0.007828920148313046, + 0.008094895631074905, + 0.008369908668100834, + 0.008443024009466171, + 0.00851231999695301, + 0.008592856116592884, + 0.008774004876613617, + 0.008958972059190273, + 0.009148877114057541, + 0.00934703927487135, + 0.009549492038786411, + 0.009738756343722343, + 0.009887280873954296, + 0.010038070380687714, + 0.010198921896517277, + 0.010376619175076485, + 0.01055741123855114, + 0.010857599787414074, + 0.01134100928902626, + 0.01184594165533781, + 0.012178754433989525, + 0.012276788242161274, + 0.012375609949231148, + 0.012541024945676327, + 0.012785522267222404, + 0.013034787029027939, + 0.013349859975278378, + 0.013743582181632519, + 0.014148916117846966, + 0.01463907677680254, + 0.015236973762512207, + 0.015859290957450867, + 0.016312438994646072, + 0.01651076041162014, + 0.01671149581670761, + 0.01731400564312935, + 0.01864517293870449, + 0.020078683272004128, + 0.021114591509103775, + 0.021067041903734207, + 0.021019598469138145, + 0.02122338116168976, + 0.0223053228110075, + 0.023442422971129417, + 0.024644386023283005, + 0.025956856086850166, + 0.027339225634932518, + 0.028803076595067978, + 0.031032871454954147, + 0.033435285091400146, + 0.03602368384599686, + 0.0377720408141613, + 0.039454974234104156, + 0.04121289402246475, + 0.04390029236674309, + 0.04711182042956352, + 0.050558287650346756, + 0.05400926619768143, + 0.057484228163957596, + 0.061182767152786255, + 0.06510869413614273, + 0.06926705688238144, + 0.07369101792573929, + 0.07810170948505402, + 0.08115416020154953, + 0.08432590216398239, + 0.08762161433696747, + 0.09266776591539383, + 0.0981224849820137, + 0.10389828681945801, + 0.10689388960599899, + 0.10858886688947678, + 0.11031072586774826, + 0.11171765625476837, + 0.11269085109233856, + 0.11367251724004745, + 0.11427262425422668, + 0.11275030672550201, + 0.11124825477600098, + 0.10976622253656387, + 0.1084076389670372, + 0.10708297789096832, + 0.10577450692653656, + 0.10330866277217865, + 0.09993725270032883, + 0.09667587280273438, + 0.09321407228708267, + 0.005385571159422398, + 0.005758531857281923, + 0.006157321389764547, + 0.006447854917496443, + 0.006670886185020208, + 0.006901632063090801, + 0.006829197518527508, + 0.006722729187458754, + 0.006682359613478184, + 0.007035768125206232, + 0.0074078673496842384, + 0.007662610150873661, + 0.007696809247136116, + 0.007731160148978233, + 0.0078116245567798615, + 0.007924920879304409, + 0.008039860986173153, + 0.008092191070318222, + 0.00812820065766573, + 0.00816437043249607, + 0.008262070827186108, + 0.008362230844795704, + 0.008505304343998432, + 0.008896798826754093, + 0.00930631160736084, + 0.009700926020741463, + 0.010031688958406448, + 0.010373728349804878, + 0.010518011637032032, + 0.010400203987956047, + 0.010283715091645718, + 0.01032956875860691, + 0.010503768920898438, + 0.010680905543267727, + 0.0108840586617589, + 0.011102838441729546, + 0.011326014995574951, + 0.011511308141052723, + 0.011685713194310665, + 0.011862761341035366, + 0.012010778300464153, + 0.01215396635234356, + 0.012298861518502235, + 0.012635362334549427, + 0.013007009401917458, + 0.013389586471021175, + 0.013663636520504951, + 0.013933108188211918, + 0.014207893051207066, + 0.014416240155696869, + 0.014623434282839298, + 0.014833605848252773, + 0.015188070945441723, + 0.015558486804366112, + 0.015937935560941696, + 0.01687016151845455, + 0.017894307151436806, + 0.01898062601685524, + 0.018975820392370224, + 0.018862804397940636, + 0.01875045895576477, + 0.019227009266614914, + 0.019810084253549576, + 0.020410839468240738, + 0.020789293572306633, + 0.021115630865097046, + 0.021447090432047844, + 0.022212134674191475, + 0.023175157606601715, + 0.024179935455322266, + 0.02542903646826744, + 0.02686857432126999, + 0.02838960476219654, + 0.029937630519270897, + 0.03151112049818039, + 0.033167313784360886, + 0.035055775195360184, + 0.0373019278049469, + 0.039691995829343796, + 0.0422569140791893, + 0.045064184814691544, + 0.048057954758405685, + 0.051237817853689194, + 0.05443083867430687, + 0.05782283470034599, + 0.06142621487379074, + 0.06518342345952988, + 0.06916014850139618, + 0.07337949424982071, + 0.07637959718704224, + 0.07877641916275024, + 0.0812484547495842, + 0.08445489406585693, + 0.08861318230628967, + 0.09297620505094528, + 0.0970018282532692, + 0.09913159906864166, + 0.10130812227725983, + 0.10353244096040726, + 0.10378570854663849, + 0.1039513424038887, + 0.10411722958087921, + 0.10444517433643341, + 0.10484997928142548, + 0.1052563488483429, + 0.10521457344293594, + 0.10446558892726898, + 0.10372194647789001, + 0.1028839573264122, + 0.10082797706127167, + 0.09881308674812317, + 0.09683845937252045, + 0.09277424216270447, + 0.010268982499837875, + 0.010340774431824684, + 0.010413359850645065, + 0.01051155012100935, + 0.010610666126012802, + 0.0107472725212574, + 0.010982832871377468, + 0.011223557405173779, + 0.011450447142124176, + 0.01166446227580309, + 0.011882477439939976, + 0.012232557870447636, + 0.012634458020329475, + 0.013049563392996788, + 0.013213807716965675, + 0.013374893926084042, + 0.013558444567024708, + 0.013837066479027271, + 0.01412141416221857, + 0.01454042550176382, + 0.015198995359241962, + 0.015887394547462463, + 0.01621895469725132, + 0.016231415793299675, + 0.016243884339928627, + 0.01632245071232319, + 0.016430091112852097, + 0.01653844118118286, + 0.017011603340506554, + 0.01757132261991501, + 0.01814945600926876, + 0.01840171031653881, + 0.018643831834197044, + 0.01890850067138672, + 0.019441958516836166, + 0.0199904665350914, + 0.02051936276257038, + 0.020874835550785065, + 0.021236468106508255, + 0.021556306630373, + 0.021723037585616112, + 0.02189105935394764, + 0.022162051871418953, + 0.022686338052153587, + 0.0232230294495821, + 0.02379274182021618, + 0.024417852982878685, + 0.02505939081311226, + 0.025742994621396065, + 0.02649141103029251, + 0.027261584997177124, + 0.02780340053141117, + 0.02792178839445114, + 0.028040682896971703, + 0.028585968539118767, + 0.029933204874396324, + 0.031343940645456314, + 0.03250390291213989, + 0.03305836021900177, + 0.033622272312641144, + 0.03433294966816902, + 0.035402894020080566, + 0.036506179720163345, + 0.037397414445877075, + 0.03748038411140442, + 0.03756353631615639, + 0.037816423922777176, + 0.03902629762887955, + 0.04027487710118294, + 0.04158586263656616, + 0.043311428278684616, + 0.04510859400033951, + 0.04698033258318901, + 0.04807455465197563, + 0.04914572834968567, + 0.05024076625704765, + 0.05080459266901016, + 0.051250144839286804, + 0.051699601113796234, + 0.05303141474723816, + 0.05484621599316597, + 0.05672311782836914, + 0.05820078402757645, + 0.05925524979829788, + 0.06032882258296013, + 0.06127787008881569, + 0.061936017125844955, + 0.0626012310385704, + 0.06322986632585526, + 0.0635477676987648, + 0.06386726349592209, + 0.06418836116790771, + 0.06469704210758209, + 0.0652298703789711, + 0.0657670870423317, + 0.06558764725923538, + 0.0650516003370285, + 0.06451994180679321, + 0.0642424151301384, + 0.0643238052725792, + 0.06440530717372894, + 0.06432486325502396, + 0.06324099004268646, + 0.06217538192868233, + 0.06112773343920708, + 0.06037585809826851, + 0.0596834234893322, + 0.05899892747402191, + 0.05816471204161644, + 0.05720781162381172, + 0.056266654282808304, + 0.055558498948812485, + 0.05569380521774292, + 0.010052116587758064, + 0.010021175257861614, + 0.00999032985419035, + 0.010068989358842373, + 0.010230734944343567, + 0.010395078919827938, + 0.010681282728910446, + 0.01099929865449667, + 0.011326230131089687, + 0.011656783521175385, + 0.011996982619166374, + 0.012479047290980816, + 0.013280984945595264, + 0.01413445733487606, + 0.01448597852140665, + 0.014364784583449364, + 0.014244605787098408, + 0.014371943660080433, + 0.014591444283723831, + 0.014814297668635845, + 0.01517972256988287, + 0.015566731803119183, + 0.01596103236079216, + 0.016338100656867027, + 0.016724079847335815, + 0.017063215374946594, + 0.017231248319149017, + 0.017400935292243958, + 0.01770380139350891, + 0.01823354884982109, + 0.018779151141643524, + 0.01895369216799736, + 0.01874624378979206, + 0.018541067838668823, + 0.018686771392822266, + 0.0190671868622303, + 0.01945534721016884, + 0.019964534789323807, + 0.020538724958896637, + 0.021129431203007698, + 0.021852774545550346, + 0.022637782618403435, + 0.02345098741352558, + 0.023930175229907036, + 0.024338748306035995, + 0.024754298850893974, + 0.02469954825937748, + 0.0245677437633276, + 0.024436643347144127, + 0.02498178370296955, + 0.025633426383137703, + 0.026302067562937737, + 0.02689269185066223, + 0.027484148740768433, + 0.028088614344596863, + 0.028943734243512154, + 0.029859868809580803, + 0.03080500103533268, + 0.031757134944200516, + 0.032734427601099014, + 0.033741798251867294, + 0.03425261750817299, + 0.03463974595069885, + 0.03503125160932541, + 0.03607115522027016, + 0.03737926483154297, + 0.038734812289476395, + 0.03982144221663475, + 0.04077021777629852, + 0.04174160212278366, + 0.04298999160528183, + 0.044480983167886734, + 0.04602368175983429, + 0.0471547432243824, + 0.04772976040840149, + 0.04831178858876228, + 0.049198295921087265, + 0.050767917186021805, + 0.05238761380314827, + 0.05414791405200958, + 0.05643685907125473, + 0.058822572231292725, + 0.061309121549129486, + 0.059913165867328644, + 0.058536287397146225, + 0.05719105154275894, + 0.05765285715460777, + 0.05854363739490509, + 0.059448178857564926, + 0.06062322482466698, + 0.06199115514755249, + 0.06338994950056076, + 0.06430547684431076, + 0.06441131234169006, + 0.0645173117518425, + 0.06480413675308228, + 0.06616366654634476, + 0.06755172461271286, + 0.06896889209747314, + 0.06827596575021744, + 0.06732736527919769, + 0.06639193743467331, + 0.06527723371982574, + 0.06406144797801971, + 0.06286831200122833, + 0.06183422729372978, + 0.061108555644750595, + 0.06039140745997429, + 0.059683140367269516, + 0.05912888050079346, + 0.05857977271080017, + 0.05803576111793518, + 0.057004306465387344, + 0.00875550601631403, + 0.008940642699599266, + 0.009145572781562805, + 0.00938217993825674, + 0.009740270674228668, + 0.010112028568983078, + 0.010520103387534618, + 0.010972225107252598, + 0.01144377700984478, + 0.011746562086045742, + 0.011975524947047234, + 0.012208949774503708, + 0.012515808455646038, + 0.012835640460252762, + 0.01318315602838993, + 0.013658695854246616, + 0.014151389710605145, + 0.01441158540546894, + 0.01420199777930975, + 0.0139954574406147, + 0.014175313524901867, + 0.014715902507305145, + 0.015277105383574963, + 0.0156319011002779, + 0.015892939642071724, + 0.016158336773514748, + 0.016597464680671692, + 0.017080776393413544, + 0.017578160390257835, + 0.017884908244013786, + 0.018192609772086143, + 0.018477141857147217, + 0.0185018852353096, + 0.01852666214108467, + 0.018701637163758278, + 0.01949542574584484, + 0.020322905853390694, + 0.020891904830932617, + 0.02074332907795906, + 0.020595809444785118, + 0.020712636411190033, + 0.0213172510266304, + 0.021939514204859734, + 0.022451067343354225, + 0.022785691544413567, + 0.023125305771827698, + 0.02367269992828369, + 0.02449331060051918, + 0.025342365726828575, + 0.025919325649738312, + 0.02616022899746895, + 0.02640337496995926, + 0.02679404616355896, + 0.02735840156674385, + 0.027934646233916283, + 0.028445547446608543, + 0.028871629387140274, + 0.02930409647524357, + 0.030035333707928658, + 0.0311959870159626, + 0.032401490956544876, + 0.03357688710093498, + 0.03466367721557617, + 0.03578564524650574, + 0.03662916645407677, + 0.036789752542972565, + 0.03695104271173477, + 0.03744499757885933, + 0.03910037875175476, + 0.04082894325256348, + 0.04241158813238144, + 0.04253092035651207, + 0.04265059158205986, + 0.042784254997968674, + 0.044057492166757584, + 0.04536861926317215, + 0.046718768775463104, + 0.04827539622783661, + 0.04990798234939575, + 0.0515957772731781, + 0.05341106653213501, + 0.05531792342662811, + 0.05729286000132561, + 0.05839622765779495, + 0.058760687708854675, + 0.05912742763757706, + 0.05979544296860695, + 0.06099725142121315, + 0.062223222106695175, + 0.06349233537912369, + 0.06488626450300217, + 0.06631079316139221, + 0.06776660680770874, + 0.06844954937696457, + 0.06908433139324188, + 0.06972500681877136, + 0.06964457035064697, + 0.06924625486135483, + 0.06885021924972534, + 0.06850913912057877, + 0.06823838502168655, + 0.0679686889052391, + 0.06763385236263275, + 0.06694073230028152, + 0.06625472754240036, + 0.0655757486820221, + 0.0647168681025505, + 0.06383848190307617, + 0.06297202408313751, + 0.06223506107926369, + 0.06160571053624153, + 0.060982730239629745, + 0.06010504812002182, + 0.008408956229686737, + 0.008613642305135727, + 0.008867226541042328, + 0.009128277190029621, + 0.009395994246006012, + 0.009671410545706749, + 0.010002869181334972, + 0.0106789730489254, + 0.011400775983929634, + 0.011827511712908745, + 0.011698562651872635, + 0.01157101895660162, + 0.011758408509194851, + 0.012163064442574978, + 0.01258164644241333, + 0.012822028249502182, + 0.013023074716329575, + 0.013224810361862183, + 0.01323346421122551, + 0.013242123648524284, + 0.013307510875165462, + 0.013613613322377205, + 0.01392675656825304, + 0.014244651421904564, + 0.014565314166247845, + 0.01489319372922182, + 0.015088529326021671, + 0.015150083228945732, + 0.015211889520287514, + 0.015731481835246086, + 0.016540629789233208, + 0.017391392961144447, + 0.017652908340096474, + 0.017717109993100166, + 0.017781546339392662, + 0.017989499494433403, + 0.01822403259575367, + 0.018461620435118675, + 0.018869919702410698, + 0.019297851249575615, + 0.01973327249288559, + 0.019950086250901222, + 0.02016928419470787, + 0.020398465916514397, + 0.020748484879732132, + 0.021104509010910988, + 0.02143508940935135, + 0.021469973027706146, + 0.02150491252541542, + 0.021591784432530403, + 0.022090109065175056, + 0.02259993553161621, + 0.023166943341493607, + 0.024110989645123482, + 0.025093508884310722, + 0.026037544012069702, + 0.026284901425242424, + 0.026534615084528923, + 0.02682032622396946, + 0.027595210820436478, + 0.028392478823661804, + 0.029210394248366356, + 0.029901277273893356, + 0.03060849942266941, + 0.03133245185017586, + 0.032086778432130814, + 0.03285999596118927, + 0.03365184739232063, + 0.034450434148311615, + 0.03526598960161209, + 0.036100853234529495, + 0.037811122834682465, + 0.039885398000478745, + 0.04207346960902214, + 0.04335397854447365, + 0.04409730061888695, + 0.044853366911411285, + 0.046194516122341156, + 0.04815675690770149, + 0.05020235478878021, + 0.05230509117245674, + 0.05443889647722244, + 0.0566597580909729, + 0.05854497104883194, + 0.0585227832198143, + 0.05850060284137726, + 0.05847843736410141, + 0.06101832166314125, + 0.0636974573135376, + 0.06649422645568848, + 0.06910070031881332, + 0.07171851396560669, + 0.07443549484014511, + 0.07578144967556, + 0.0759691372513771, + 0.07615728676319122, + 0.0764874592423439, + 0.07713570445775986, + 0.07778944820165634, + 0.07836699485778809, + 0.07732503116130829, + 0.07629692554473877, + 0.0752824917435646, + 0.07430989295244217, + 0.07335837930440903, + 0.07241905480623245, + 0.07176247984170914, + 0.07141933590173721, + 0.07107783108949661, + 0.07059802860021591, + 0.06933091580867767, + 0.06808653473854065, + 0.0668644905090332, + 0.007309998385608196, + 0.007525007240474224, + 0.007579372264444828, + 0.007634129840880632, + 0.007821889594197273, + 0.008102885447442532, + 0.008393975906074047, + 0.008711446076631546, + 0.009043479338288307, + 0.009397700428962708, + 0.009847762994468212, + 0.010319377295672894, + 0.010694531723856926, + 0.01084225159138441, + 0.010992012917995453, + 0.01104141864925623, + 0.011006138287484646, + 0.010970971547067165, + 0.011175950989127159, + 0.011471496894955635, + 0.011774858459830284, + 0.01172952726483345, + 0.011654115281999111, + 0.011613953858613968, + 0.011959480121731758, + 0.012315287254750729, + 0.0126612838357687, + 0.012947567738592625, + 0.013240324333310127, + 0.013501144014298916, + 0.01369831059128046, + 0.013898355886340141, + 0.014081566594541073, + 0.014245362021028996, + 0.014411062933504581, + 0.014880206435918808, + 0.015596991404891014, + 0.016348304226994514, + 0.016643226146697998, + 0.016690298914909363, + 0.016737505793571472, + 0.016758281737565994, + 0.0167690459638834, + 0.016779813915491104, + 0.01702093333005905, + 0.017333779484033585, + 0.017652375623583794, + 0.01801528036594391, + 0.01839495822787285, + 0.018782639876008034, + 0.01924724690616131, + 0.01973835751414299, + 0.02024199813604355, + 0.020572897046804428, + 0.020869165658950806, + 0.02116970159113407, + 0.02176816016435623, + 0.022456496953964233, + 0.023166604340076447, + 0.02398223616182804, + 0.02485201694071293, + 0.025753343477845192, + 0.02660975232720375, + 0.027463622391223907, + 0.02834489196538925, + 0.02928856573998928, + 0.030282504856586456, + 0.031310174614191055, + 0.032128941267728806, + 0.032778408378362656, + 0.03344101086258888, + 0.034681789577007294, + 0.036662060767412186, + 0.03875540941953659, + 0.040612347424030304, + 0.041847605258226395, + 0.04312043637037277, + 0.04459657147526741, + 0.046798672527074814, + 0.049109503626823425, + 0.05146893858909607, + 0.052553676068782806, + 0.053661275655031204, + 0.054792217910289764, + 0.056696854531764984, + 0.058782003819942474, + 0.060943834483623505, + 0.0631876066327095, + 0.06551516056060791, + 0.06792846322059631, + 0.07063665986061096, + 0.0736946240067482, + 0.07688497751951218, + 0.07976728677749634, + 0.08132819086313248, + 0.0829196348786354, + 0.08454222232103348, + 0.08492544293403625, + 0.08530565351247787, + 0.0856875628232956, + 0.08643079549074173, + 0.08731383085250854, + 0.08820588886737823, + 0.08856051415205002, + 0.08824720978736877, + 0.08793500810861588, + 0.08750173449516296, + 0.08637042343616486, + 0.0852537453174591, + 0.0841515064239502, + 0.08037830889225006, + 0.07624936103820801, + 0.07233251631259918, + 0.00833088532090187, + 0.008521289564669132, + 0.008860998786985874, + 0.009214249439537525, + 0.009472442790865898, + 0.009573981165885925, + 0.009676607325673103, + 0.0098513662815094, + 0.01006684172898531, + 0.010287029668688774, + 0.010509159415960312, + 0.010735760442912579, + 0.010964127257466316, + 0.011175214312970638, + 0.011390366591513157, + 0.011671626940369606, + 0.012086617760360241, + 0.012516365386545658, + 0.012843115255236626, + 0.013071481138467789, + 0.013303905725479126, + 0.013588075526058674, + 0.013898450881242752, + 0.014215917326509953, + 0.014475085772573948, + 0.014729026705026627, + 0.01498374156653881, + 0.015017849393188953, + 0.015052033588290215, + 0.015147922560572624, + 0.015610874630510807, + 0.016087977215647697, + 0.016575627028942108, + 0.017066266387701035, + 0.017571430653333664, + 0.017962265759706497, + 0.01812737062573433, + 0.018293991684913635, + 0.018460404127836227, + 0.018626097589731216, + 0.018793277442455292, + 0.01899399794638157, + 0.01922871358692646, + 0.019466329365968704, + 0.019879784435033798, + 0.020445894449949265, + 0.021028125658631325, + 0.02138771116733551, + 0.021582242101430893, + 0.021778538823127747, + 0.022424181923270226, + 0.023401785641908646, + 0.02442200668156147, + 0.02525578998029232, + 0.025958646088838577, + 0.02668105997145176, + 0.026860114187002182, + 0.02663549967110157, + 0.026412760838866234, + 0.026927175000309944, + 0.028097737580537796, + 0.02931918390095234, + 0.030003873631358147, + 0.03008997067809105, + 0.0301763117313385, + 0.030899981036782265, + 0.03256265074014664, + 0.03431478515267372, + 0.03561202809214592, + 0.03584308549761772, + 0.036075640469789505, + 0.03654314950108528, + 0.03782733157277107, + 0.03915664181113243, + 0.04053228348493576, + 0.041952911764383316, + 0.043423332273960114, + 0.04494529217481613, + 0.04704562947154045, + 0.04926350712776184, + 0.05158594250679016, + 0.05264336243271828, + 0.053395550698041916, + 0.054158493876457214, + 0.05544373020529747, + 0.05706506595015526, + 0.058733806014060974, + 0.0605420246720314, + 0.06252514570951462, + 0.06457322835922241, + 0.06669431924819946, + 0.06890575587749481, + 0.07119052112102509, + 0.07355103641748428, + 0.07514002174139023, + 0.07676254212856293, + 0.07842010259628296, + 0.0788031741976738, + 0.07875745743513107, + 0.07871177047491074, + 0.07858787477016449, + 0.0783815085887909, + 0.07817568629980087, + 0.07792264223098755, + 0.07748175412416458, + 0.07704336196184158, + 0.07660745829343796, + 0.07737735658884048, + 0.07829359173774719, + 0.07922068238258362, + 0.07747308909893036, + 0.07389423251152039, + 0.07048070430755615, + 0.007997523993253708, + 0.008142204023897648, + 0.008196987211704254, + 0.008250726386904716, + 0.008388296701014042, + 0.008779781870543957, + 0.009189537726342678, + 0.009464732371270657, + 0.009599379263818264, + 0.00973594095557928, + 0.009989475831389427, + 0.010288911871612072, + 0.01059732399880886, + 0.010859769769012928, + 0.011127338744699955, + 0.011363505385816097, + 0.01143538299947977, + 0.011507713235914707, + 0.01169753447175026, + 0.012088636867702007, + 0.012492815963923931, + 0.01269812136888504, + 0.012736682780086994, + 0.01277536153793335, + 0.013064594008028507, + 0.013462826609611511, + 0.013873197138309479, + 0.014105993323028088, + 0.01431211270391941, + 0.014521244913339615, + 0.014916155487298965, + 0.015323366038501263, + 0.01570173352956772, + 0.015744369477033615, + 0.015787122771143913, + 0.015908947214484215, + 0.016350343823432922, + 0.016803987324237823, + 0.017200972884893417, + 0.017428409308195114, + 0.01765885390341282, + 0.017837580293416977, + 0.017914190888404846, + 0.01799112930893898, + 0.01825408823788166, + 0.01881457306444645, + 0.01939227059483528, + 0.02001919597387314, + 0.020710507407784462, + 0.02142569050192833, + 0.022119896486401558, + 0.022776437923312187, + 0.023452462628483772, + 0.02391434647142887, + 0.02407994493842125, + 0.024246690794825554, + 0.024521470069885254, + 0.02495161071419716, + 0.0253892969340086, + 0.0261020939797163, + 0.02729003131389618, + 0.028532028198242188, + 0.02946367859840393, + 0.02965722791850567, + 0.02985205128788948, + 0.030192939564585686, + 0.03096955083310604, + 0.0317661352455616, + 0.03269405663013458, + 0.034225210547447205, + 0.03582807630300522, + 0.037491969764232635, + 0.03900769725441933, + 0.04058470204472542, + 0.04222546145319939, + 0.0442102812230587, + 0.046307776123285294, + 0.0485047847032547, + 0.0500786229968071, + 0.05151384696364403, + 0.052990201860666275, + 0.05530565604567528, + 0.05819878727197647, + 0.061243265867233276, + 0.06350703537464142, + 0.06473731249570847, + 0.06599142402410507, + 0.06756901741027832, + 0.07002905756235123, + 0.07257866114377975, + 0.07507306337356567, + 0.07508981227874756, + 0.07510656118392944, + 0.07512331753969193, + 0.07587601244449615, + 0.0767948105931282, + 0.07772473245859146, + 0.0782112181186676, + 0.07836629450321198, + 0.07852166891098022, + 0.07860810309648514, + 0.07854022830724716, + 0.07847240567207336, + 0.07838401943445206, + 0.07747133076190948, + 0.07656926661729813, + 0.07567770779132843, + 0.07468817383050919, + 0.07367012649774551, + 0.07266595214605331, + 0.07141638547182083, + 0.06980482488870621, + 0.06822963058948517, + 0.009189484640955925, + 0.009237740188837051, + 0.009430536068975925, + 0.00964437983930111, + 0.009850968606770039, + 0.010000819340348244, + 0.010152950882911682, + 0.01036271546036005, + 0.010654403828084469, + 0.010954302735626698, + 0.011254437267780304, + 0.01155849825590849, + 0.011870774440467358, + 0.012287618592381477, + 0.012731908820569515, + 0.013169377110898495, + 0.01339789479970932, + 0.013630378060042858, + 0.013811222277581692, + 0.013855614699423313, + 0.01390014961361885, + 0.014276781119406223, + 0.015067131258547306, + 0.0159012321382761, + 0.01615753024816513, + 0.01604919694364071, + 0.015941590070724487, + 0.01606084778904915, + 0.016249634325504303, + 0.01644064113497734, + 0.016586942598223686, + 0.01672923006117344, + 0.016879381611943245, + 0.01761499233543873, + 0.018382661044597626, + 0.01907542534172535, + 0.018888413906097412, + 0.018703240901231766, + 0.018600044772028923, + 0.018846072256565094, + 0.01909535750746727, + 0.019389895722270012, + 0.01981639489531517, + 0.020252278074622154, + 0.020785335451364517, + 0.0215452928096056, + 0.022333035245537758, + 0.02285691909492016, + 0.022792940959334373, + 0.022729141637682915, + 0.022824635729193687, + 0.023230789229273796, + 0.02364417165517807, + 0.02414197474718094, + 0.024804435670375824, + 0.025485074147582054, + 0.026273099705576897, + 0.02728196606040001, + 0.028329573571681976, + 0.029369009658694267, + 0.030318928882479668, + 0.031299568712711334, + 0.03208186849951744, + 0.03209422528743744, + 0.032106585800647736, + 0.03228185325860977, + 0.033360954374074936, + 0.034476131200790405, + 0.035647422075271606, + 0.037131767719984055, + 0.038677919656038284, + 0.04028845205903053, + 0.04156961292028427, + 0.042874775826931, + 0.04422091320157051, + 0.04601147025823593, + 0.04795663058757782, + 0.04998402297496796, + 0.0515567772090435, + 0.052936580032110214, + 0.05435331165790558, + 0.05581894516944885, + 0.05733386427164078, + 0.05888989567756653, + 0.06053651124238968, + 0.062317926436662674, + 0.06415175646543503, + 0.06587660312652588, + 0.06680379062891006, + 0.06774402409791946, + 0.068697489798069, + 0.0705539882183075, + 0.07250752300024033, + 0.07451514899730682, + 0.07453334331512451, + 0.07377298176288605, + 0.07302037626504898, + 0.07254847139120102, + 0.0723850205540657, + 0.07222194224596024, + 0.07191021740436554, + 0.07102344930171967, + 0.07014761120080948, + 0.06928258389234543, + 0.0691041424870491, + 0.06898673623800278, + 0.06886952370405197, + 0.06793361157178879, + 0.06650658696889877, + 0.06510953605175018, + 0.06408728659152985, + 0.06391951441764832, + 0.063752181828022, + 0.007094438653439283, + 0.007318592164665461, + 0.007450341712683439, + 0.007569166831672192, + 0.007690631318837404, + 0.007818764075636864, + 0.00794903188943863, + 0.008103481493890285, + 0.008295688778162003, + 0.008492455817759037, + 0.008687478490173817, + 0.00888317171484232, + 0.009083273820579052, + 0.009447249583899975, + 0.009853866882622242, + 0.010252087377011776, + 0.010284322313964367, + 0.010316656902432442, + 0.010427217930555344, + 0.010770386084914207, + 0.011124847456812859, + 0.011512243188917637, + 0.011941912584006786, + 0.012387619353830814, + 0.012574479915201664, + 0.012576918117702007, + 0.012579357251524925, + 0.01278239581733942, + 0.01306135393679142, + 0.013346399180591106, + 0.013663687743246555, + 0.01399257592856884, + 0.014329380355775356, + 0.014486847445368767, + 0.014642281457781792, + 0.014822118915617466, + 0.015284556895494461, + 0.015761423856019974, + 0.016220325604081154, + 0.016511401161551476, + 0.01680770143866539, + 0.017124278470873833, + 0.017501063644886017, + 0.01788613572716713, + 0.018296781927347183, + 0.018765075132250786, + 0.01924535445868969, + 0.01972544565796852, + 0.02018721215426922, + 0.020659789443016052, + 0.02110053226351738, + 0.02145349234342575, + 0.021812357008457184, + 0.022173665463924408, + 0.02253277599811554, + 0.02289770357310772, + 0.023632558062672615, + 0.025353824719786644, + 0.02720046043395996, + 0.02863849513232708, + 0.028489792719483376, + 0.028341861441731453, + 0.028526071459054947, + 0.03013700619339943, + 0.03183891624212265, + 0.03345702961087227, + 0.033833060413599014, + 0.034213315695524216, + 0.034633006900548935, + 0.03610116243362427, + 0.037631556391716, + 0.03922683000564575, + 0.040095072239637375, + 0.04091924428939819, + 0.04176035523414612, + 0.043677136301994324, + 0.045957643538713455, + 0.048357222229242325, + 0.05101396143436432, + 0.05388801917433739, + 0.056924007833004, + 0.05949026346206665, + 0.06151524931192398, + 0.06360916048288345, + 0.06562291085720062, + 0.06737704575061798, + 0.06917808204889297, + 0.07090475410223007, + 0.07183951139450073, + 0.0727865919470787, + 0.07374615967273712, + 0.07534882426261902, + 0.0770450010895729, + 0.07877935469150543, + 0.07936884462833405, + 0.07942188531160355, + 0.07947497069835663, + 0.07966195791959763, + 0.08002305030822754, + 0.08038578182458878, + 0.08043458312749863, + 0.0789448469877243, + 0.07748270779848099, + 0.07604764401912689, + 0.07539041340351105, + 0.0748385637998581, + 0.07429074496030807, + 0.07358867675065994, + 0.07277896255254745, + 0.07197815924882889, + 0.07062419503927231, + 0.06770636886358261, + 0.06490910053253174, + 0.005424450617283583, + 0.005560057237744331, + 0.005629475228488445, + 0.0056917425245046616, + 0.005808508954942226, + 0.006208018399775028, + 0.006635005585849285, + 0.006867426447570324, + 0.006803272292017937, + 0.006739718373864889, + 0.007053398061543703, + 0.007591084577143192, + 0.008169759064912796, + 0.008102458901703358, + 0.007951973006129265, + 0.007843210361897945, + 0.00811235886067152, + 0.008390743285417557, + 0.008614662103354931, + 0.008683721534907818, + 0.008753336034715176, + 0.008924885652959347, + 0.009220544248819351, + 0.009525997564196587, + 0.009785820730030537, + 0.010018550790846348, + 0.010256816633045673, + 0.010550801642239094, + 0.01086863037198782, + 0.011196033097803593, + 0.011316563934087753, + 0.011414026841521263, + 0.011517759412527084, + 0.012101625092327595, + 0.01271508727222681, + 0.013316906988620758, + 0.013582480140030384, + 0.013853349722921848, + 0.014144514687359333, + 0.014507724903523922, + 0.01488026138395071, + 0.015295000746846199, + 0.015821615234017372, + 0.01636636070907116, + 0.01682196743786335, + 0.017032278701663017, + 0.0172452200204134, + 0.017735058441758156, + 0.018828770145773888, + 0.01998993195593357, + 0.02076936885714531, + 0.020701982080936432, + 0.020634816959500313, + 0.02070540562272072, + 0.021048035472631454, + 0.0213963370770216, + 0.02188432775437832, + 0.022679012268781662, + 0.02350255660712719, + 0.024264175444841385, + 0.02481016516685486, + 0.02536844275891781, + 0.026175478473305702, + 0.02785375528037548, + 0.029639635235071182, + 0.03129017725586891, + 0.031638141721487045, + 0.03198997676372528, + 0.032373614609241486, + 0.033158715814352036, + 0.033962856978178024, + 0.03478650003671646, + 0.03674936294555664, + 0.03887238726019859, + 0.041118063032627106, + 0.043644532561302185, + 0.046357594430446625, + 0.04923931509256363, + 0.05155685544013977, + 0.05364588275551796, + 0.0558195561170578, + 0.05763809755444527, + 0.05912281200289726, + 0.060645777732133865, + 0.06280127167701721, + 0.06614381074905396, + 0.06966426223516464, + 0.07293075323104858, + 0.07404498010873795, + 0.07517623156309128, + 0.07632476836442947, + 0.07883421331644058, + 0.08149751275777817, + 0.0842507854104042, + 0.08526106923818588, + 0.08557341247797012, + 0.08588691055774689, + 0.0864056944847107, + 0.08715853840112686, + 0.08791793137788773, + 0.08856528997421265, + 0.08875223249197006, + 0.08893957734107971, + 0.089127317070961, + 0.0871446281671524, + 0.08501891046762466, + 0.08294504135847092, + 0.08068252354860306, + 0.0783354789018631, + 0.07605670392513275, + 0.07410941272974014, + 0.07284712046384811, + 0.07160632312297821, + 0.0050819492898881435, + 0.00512757059186697, + 0.005348986014723778, + 0.005582801066339016, + 0.005772546865046024, + 0.005808491259813309, + 0.0058446601033210754, + 0.005873104091733694, + 0.0058940681628882885, + 0.005915106739848852, + 0.006057492457330227, + 0.006244895979762077, + 0.006438096985220909, + 0.006824064534157515, + 0.007238070480525494, + 0.007609996944665909, + 0.007697259541600943, + 0.007785522844642401, + 0.007874608039855957, + 0.007964396849274635, + 0.008055209182202816, + 0.00823360588401556, + 0.008487394079566002, + 0.008749004453420639, + 0.00908999890089035, + 0.009473691694438457, + 0.009873580187559128, + 0.010426550172269344, + 0.011033604852855206, + 0.011676003225147724, + 0.011399555951356888, + 0.011122258380055428, + 0.0109183294698596, + 0.011292604729533195, + 0.011679710820317268, + 0.012073980644345284, + 0.012456626631319523, + 0.012851398438215256, + 0.013279660604894161, + 0.01377746369689703, + 0.014293928630650043, + 0.014814484864473343, + 0.015324180945754051, + 0.01585141383111477, + 0.01639215089380741, + 0.016943955793976784, + 0.017514338716864586, + 0.01807381771504879, + 0.018609171733260155, + 0.019160382449626923, + 0.019366417080163956, + 0.01911713369190693, + 0.018871059641242027, + 0.01915690116584301, + 0.02016378380358219, + 0.021223586052656174, + 0.022115064784884453, + 0.022720828652381897, + 0.02334318682551384, + 0.023863745853304863, + 0.024198798462748528, + 0.02453855238854885, + 0.0251400675624609, + 0.02630927972495556, + 0.027532869949936867, + 0.02867676317691803, + 0.02945641428232193, + 0.03025725856423378, + 0.031252846121788025, + 0.03318929672241211, + 0.035245731472969055, + 0.037360869348049164, + 0.03849797695875168, + 0.039669688791036606, + 0.040877070277929306, + 0.04226861894130707, + 0.043717678636312485, + 0.04521641880273819, + 0.04742411896586418, + 0.04991694167256355, + 0.052540794014930725, + 0.05494661629199982, + 0.05725277215242386, + 0.05965571850538254, + 0.06265659630298615, + 0.06642164289951324, + 0.07041294127702713, + 0.07383187115192413, + 0.07513473182916641, + 0.0764605924487114, + 0.07791143655776978, + 0.08117485046386719, + 0.08457495272159576, + 0.08811747282743454, + 0.08834993839263916, + 0.08786465972661972, + 0.08738204091787338, + 0.08913633972406387, + 0.09263759851455688, + 0.09627638012170792, + 0.09797105938196182, + 0.09511730074882507, + 0.0923466682434082, + 0.08967795222997665, + 0.08791938424110413, + 0.08619530498981476, + 0.08450502157211304, + 0.08220582455396652, + 0.07972811162471771, + 0.07732506841421127, + 0.07529759407043457, + 0.07377217710018158, + 0.07227766513824463, + 0.0067705074325203896, + 0.006901037413626909, + 0.006800130475312471, + 0.0067006987519562244, + 0.006726364605128765, + 0.006940307095646858, + 0.007161054294556379, + 0.00725843058899045, + 0.007289778906852007, + 0.007321262266486883, + 0.007364836987107992, + 0.007410003803670406, + 0.0074998969212174416, + 0.007911251857876778, + 0.008345168083906174, + 0.008776200003921986, + 0.009174156002700329, + 0.009590156376361847, + 0.009983316995203495, + 0.010354169644415379, + 0.010738798417150974, + 0.011042533442378044, + 0.011314673349261284, + 0.011593520641326904, + 0.011619037948548794, + 0.011606122367084026, + 0.011598663404583931, + 0.011925230734050274, + 0.01226099394261837, + 0.012631162069737911, + 0.013163299299776554, + 0.013717854395508766, + 0.014177768491208553, + 0.014312275685369968, + 0.014448057860136032, + 0.01457528118044138, + 0.014685841277241707, + 0.014797239564359188, + 0.014995328150689602, + 0.015307695604860783, + 0.01562657207250595, + 0.015946652740240097, + 0.016267843544483185, + 0.0165955051779747, + 0.01714911311864853, + 0.01790657266974449, + 0.01869748719036579, + 0.01905602589249611, + 0.01909005083143711, + 0.019124135375022888, + 0.01942826248705387, + 0.019922452047467232, + 0.020429212599992752, + 0.02083071507513523, + 0.021159464493393898, + 0.021493403241038322, + 0.022031527012586594, + 0.022732457146048546, + 0.02345568686723709, + 0.024160975590348244, + 0.02485208585858345, + 0.025562962517142296, + 0.026438672095537186, + 0.0275004543364048, + 0.02860487811267376, + 0.029506003484129906, + 0.030086927115917206, + 0.030679289251565933, + 0.03145909681916237, + 0.03262268751859665, + 0.03382930904626846, + 0.03525179997086525, + 0.03734371438622475, + 0.03955977410078049, + 0.041775915771722794, + 0.042962849140167236, + 0.044183503836393356, + 0.045438844710588455, + 0.04763482138514519, + 0.049970533698797226, + 0.05242077633738518, + 0.05452034994959831, + 0.05658867582678795, + 0.058735474944114685, + 0.06046381965279579, + 0.06194677576422691, + 0.06346610188484192, + 0.06523855775594711, + 0.06734415143728256, + 0.06951770931482315, + 0.07191988825798035, + 0.07496127486228943, + 0.07813127338886261, + 0.08143532276153564, + 0.08246233314275742, + 0.08350010216236115, + 0.08455092459917068, + 0.085631363093853, + 0.08673109859228134, + 0.08784494549036026, + 0.08854533731937408, + 0.08879680186510086, + 0.08904898166656494, + 0.089126817882061, + 0.08851272612810135, + 0.08790287375450134, + 0.0872972160577774, + 0.08555634319782257, + 0.08372487872838974, + 0.08193262666463852, + 0.07936851680278778, + 0.07631418108940125, + 0.07337739318609238, + 0.004143050871789455, + 0.004214494023472071, + 0.004363374784588814, + 0.004517513792961836, + 0.0046272422187030315, + 0.004707080777734518, + 0.004788297228515148, + 0.004922602791339159, + 0.0050689359195530415, + 0.005220010410994291, + 0.005378910340368748, + 0.005542646162211895, + 0.0056839934550225735, + 0.005773578770458698, + 0.00586457597091794, + 0.005967006087303162, + 0.006079705432057381, + 0.006194533314555883, + 0.006358704529702663, + 0.0065442402847111225, + 0.006735189352184534, + 0.006917433813214302, + 0.007103342562913895, + 0.00730909314006567, + 0.007689805701375008, + 0.008090347982943058, + 0.008440815843641758, + 0.008564955554902554, + 0.008690920658409595, + 0.00879234541207552, + 0.008848246186971664, + 0.008904503658413887, + 0.00911569595336914, + 0.009507846087217331, + 0.009916865266859531, + 0.010206852108240128, + 0.010403388179838657, + 0.010603707283735275, + 0.010942515917122364, + 0.011364536359906197, + 0.01180283259600401, + 0.012108924798667431, + 0.012365639209747314, + 0.012627795338630676, + 0.012875278480350971, + 0.013121643103659153, + 0.013372722081840038, + 0.013762266375124454, + 0.014195960946381092, + 0.014643322676420212, + 0.015094280242919922, + 0.015556826256215572, + 0.016033543273806572, + 0.016299957409501076, + 0.016522403806447983, + 0.016747886314988136, + 0.017364144325256348, + 0.01810077205300331, + 0.018868647515773773, + 0.019682176411151886, + 0.020534807816147804, + 0.021424373611807823, + 0.022415872663259506, + 0.023479022085666656, + 0.024592598900198936, + 0.025411589071154594, + 0.02606813982129097, + 0.02674165368080139, + 0.027706701308488846, + 0.02892647497355938, + 0.030199948698282242, + 0.03157825395464897, + 0.033078864216804504, + 0.034650787711143494, + 0.036244817078113556, + 0.037806250154972076, + 0.039434947073459625, + 0.041269656270742416, + 0.04375327378511429, + 0.04638636112213135, + 0.0491861067712307, + 0.052333422005176544, + 0.05568212643265724, + 0.05924511328339577, + 0.0626325011253357, + 0.06615141779184341, + 0.0698680430650711, + 0.07304222136735916, + 0.07599464803934097, + 0.07906642556190491, + 0.08254717290401459, + 0.08651698380708694, + 0.09067771583795547, + 0.09438007324934006, + 0.09612306207418442, + 0.09789823740720749, + 0.09970620274543762, + 0.10098014771938324, + 0.10226821899414062, + 0.10357272624969482, + 0.10384707897901535, + 0.10374002158641815, + 0.10363306850194931, + 0.10310935229063034, + 0.10208117216825485, + 0.10106325149536133, + 0.09961853921413422, + 0.09573931992053986, + 0.09201115369796753, + 0.08842816948890686, + 0.08457068353891373, + 0.08079902827739716, + 0.07719557732343674, + 0.003774360753595829, + 0.003847265150398016, + 0.003911368083208799, + 0.003976538311690092, + 0.004169799853116274, + 0.0043922485783696175, + 0.00459787342697382, + 0.004619638901203871, + 0.004641507752239704, + 0.004751280881464481, + 0.005017045419663191, + 0.005297675728797913, + 0.005402959883213043, + 0.005385869182646275, + 0.005368832498788834, + 0.005446701310575008, + 0.005547667387872934, + 0.005652022082358599, + 0.00588182732462883, + 0.006120976526290178, + 0.006343390326946974, + 0.006460743490606546, + 0.006580268498510122, + 0.006737025920301676, + 0.00696217268705368, + 0.0071948436088860035, + 0.007436865475028753, + 0.007688608486205339, + 0.007948873564600945, + 0.008186227641999722, + 0.00841238722205162, + 0.008644793182611465, + 0.008665282279253006, + 0.008616800419986248, + 0.008568589575588703, + 0.00876747164875269, + 0.009013544768095016, + 0.009266523644328117, + 0.009606920182704926, + 0.00996497180312872, + 0.01033222395926714, + 0.010286598466336727, + 0.010241174139082432, + 0.010227217338979244, + 0.010705804452300072, + 0.011206788010895252, + 0.011723203584551811, + 0.01218440942466259, + 0.012663759291172028, + 0.01311604306101799, + 0.013218667358160019, + 0.013322094455361366, + 0.013445787131786346, + 0.013723337091505527, + 0.01400661375373602, + 0.01431757677346468, + 0.014840690419077873, + 0.015382918529212475, + 0.015962671488523483, + 0.016826840117573738, + 0.017737790942192078, + 0.01869107410311699, + 0.019249293953180313, + 0.019824180752038956, + 0.020416241139173508, + 0.021230779588222504, + 0.022089332342147827, + 0.022982604801654816, + 0.02444348856806755, + 0.026086943224072456, + 0.02784089557826519, + 0.02975008822977543, + 0.03180261701345444, + 0.03399674966931343, + 0.036292411386966705, + 0.03871363028883934, + 0.041296377778053284, + 0.04343018680810928, + 0.04504676163196564, + 0.046723511070013046, + 0.04926759749650955, + 0.05354932323098183, + 0.058203160762786865, + 0.06310418993234634, + 0.06764506548643112, + 0.07251270115375519, + 0.07773059606552124, + 0.07895288616418839, + 0.08014863729476929, + 0.08136249333620071, + 0.08428654819726944, + 0.08781277388334274, + 0.09148652106523514, + 0.09517580270767212, + 0.09889877587556839, + 0.10276737064123154, + 0.10607891529798508, + 0.10789083689451218, + 0.1097337007522583, + 0.11145378649234772, + 0.11012174189090729, + 0.10880561172962189, + 0.10750521719455719, + 0.10481971502304077, + 0.10178907215595245, + 0.09884606301784515, + 0.09632176160812378, + 0.0942344069480896, + 0.09219228476285934, + 0.09013066440820694, + 0.0877590999007225, + 0.0854499414563179, + 0.08320154249668121, + 0.003687261836603284, + 0.0036509798374027014, + 0.0035972236655652523, + 0.0035915684420615435, + 0.003788151079788804, + 0.003995493520051241, + 0.004132942296564579, + 0.00417680200189352, + 0.004221127834171057, + 0.004294862039387226, + 0.004382506012916565, + 0.004471938591450453, + 0.004585146438330412, + 0.004702895414084196, + 0.004829686600714922, + 0.004996445961296558, + 0.005168963689357042, + 0.005316582508385181, + 0.0054083336144685745, + 0.005501667968928814, + 0.005610759370028973, + 0.005735018290579319, + 0.005862028803676367, + 0.005989169701933861, + 0.006117857061326504, + 0.006249309051781893, + 0.006371994037181139, + 0.006494911387562752, + 0.006620199419558048, + 0.006787515711039305, + 0.006959924008697271, + 0.007126328535377979, + 0.007199504412710667, + 0.007273432333022356, + 0.007357832510024309, + 0.0074825468473136425, + 0.007609374821186066, + 0.007769021205604076, + 0.008010526187717915, + 0.008259537629783154, + 0.008458968251943588, + 0.008558136411011219, + 0.00865846686065197, + 0.008838851936161518, + 0.00914039183408022, + 0.009452218189835548, + 0.00973085593432188, + 0.009961946867406368, + 0.01019852515310049, + 0.010515299625694752, + 0.010930740274488926, + 0.011362594552338123, + 0.011691413819789886, + 0.011891333386301994, + 0.012094670906662941, + 0.012457924894988537, + 0.01302768662571907, + 0.01362350583076477, + 0.014162669889628887, + 0.014605654403567314, + 0.01506249513477087, + 0.0155513696372509, + 0.016086502000689507, + 0.01664005033671856, + 0.01728278025984764, + 0.018112491816282272, + 0.01898203231394291, + 0.019955094903707504, + 0.021198159083724022, + 0.022518660873174667, + 0.023884380236268044, + 0.025069890543818474, + 0.02631424181163311, + 0.02762668766081333, + 0.02955523133277893, + 0.031618405133485794, + 0.033825598657131195, + 0.03638581559062004, + 0.03916984423995018, + 0.04216689243912697, + 0.04569171369075775, + 0.04963451251387596, + 0.053917549550533295, + 0.058268629014492035, + 0.06271031498908997, + 0.0674905851483345, + 0.07220086455345154, + 0.07644318789243698, + 0.08093477040529251, + 0.08594916760921478, + 0.09272731095552444, + 0.1000399962067604, + 0.10792937129735947, + 0.11121559888124466, + 0.11424394696950912, + 0.11735475063323975, + 0.12045636773109436, + 0.12359745800495148, + 0.12682045996189117, + 0.12758024036884308, + 0.125068798661232, + 0.1226067990064621, + 0.11966408789157867, + 0.11400184780359268, + 0.10860752314329147, + 0.10346845537424088, + 0.0995236337184906, + 0.09588287025690079, + 0.09237530827522278, + 0.08773978799581528, + 0.08233687281608582, + 0.07726666331291199, + 0.0726766362786293, + 0.0023160905111581087, + 0.002391279675066471, + 0.002468909602612257, + 0.0025055164005607367, + 0.002510419115424156, + 0.0025153313763439655, + 0.0025921796914190054, + 0.0026860027574002743, + 0.0027860263362526894, + 0.0029212436638772488, + 0.0030630240216851234, + 0.003155788639560342, + 0.0031307372264564037, + 0.0031058848835527897, + 0.0031177739147096872, + 0.0031621288508176804, + 0.0032071152236312628, + 0.003254625713452697, + 0.0033035322558134794, + 0.0033531731460243464, + 0.003499304410070181, + 0.0036607016809284687, + 0.0038205329328775406, + 0.00389171508140862, + 0.003964222967624664, + 0.004047180991619825, + 0.004161166027188301, + 0.004278360866010189, + 0.00436132587492466, + 0.004383856430649757, + 0.004406503401696682, + 0.004444125108420849, + 0.004497120622545481, + 0.0045507485046982765, + 0.004634576849639416, + 0.004739756695926189, + 0.004847323521971703, + 0.004997922573238611, + 0.005171864293515682, + 0.005351860076189041, + 0.005519235506653786, + 0.005685871466994286, + 0.005857538897544146, + 0.006036770064383745, + 0.006222022231668234, + 0.006412959657609463, + 0.006632925011217594, + 0.006864367984235287, + 0.007103886920958757, + 0.007171423640102148, + 0.007215459831058979, + 0.007259765639901161, + 0.0074807386845350266, + 0.007731941994279623, + 0.007991580292582512, + 0.008240200579166412, + 0.008493661880493164, + 0.008754921145737171, + 0.009028110653162003, + 0.009310550056397915, + 0.009601824916899204, + 0.01016273908317089, + 0.010825850069522858, + 0.011532227508723736, + 0.011956344358623028, + 0.012277876958251, + 0.012608055025339127, + 0.013254671357572079, + 0.014104903675615788, + 0.015009676106274128, + 0.015945054590702057, + 0.016916003078222275, + 0.017946073785424232, + 0.01937040500342846, + 0.021359659731388092, + 0.02355320379137993, + 0.026058075949549675, + 0.029038088396191597, + 0.03235889598727226, + 0.03598446026444435, + 0.039594944566488266, + 0.043567683547735214, + 0.04793902486562729, + 0.05249093100428581, + 0.05747409537434578, + 0.06293033063411713, + 0.06914715468883514, + 0.0760403648018837, + 0.08362074196338654, + 0.09300760179758072, + 0.10421063005924225, + 0.11676307767629623, + 0.12724386155605316, + 0.1326674073934555, + 0.1383221447467804, + 0.14353860914707184, + 0.14489510655403137, + 0.1462644338607788, + 0.1476466804742813, + 0.14650654792785645, + 0.14506085216999054, + 0.14362941682338715, + 0.13696029782295227, + 0.1275162696838379, + 0.11872345954179764, + 0.11142631620168686, + 0.10640177875757217, + 0.10160379856824875, + 0.09701424837112427, + 0.09028388559818268, + 0.0840204507112503, + 0.07819153368473053, + 0.07263874262571335, + 0.001921159098856151, + 0.0020063321571797132, + 0.002094699302688241, + 0.0021357813384383917, + 0.0021776692010462284, + 0.0022211766336113214, + 0.0022676780354231596, + 0.002315152669325471, + 0.0023952668998390436, + 0.0025078942999243736, + 0.002625817898660898, + 0.0026969618629664183, + 0.002753431675955653, + 0.002811084035784006, + 0.0028629221487790346, + 0.002915575634688139, + 0.002976735820993781, + 0.003073554253205657, + 0.0031735217198729515, + 0.0032450128346681595, + 0.003263937309384346, + 0.003282971912994981, + 0.003333327593281865, + 0.0034113426227122545, + 0.0034911837428808212, + 0.003583489218726754, + 0.003682931186631322, + 0.0037851324304938316, + 0.003826642408967018, + 0.0038563665002584457, + 0.0038863213267177343, + 0.004068319220095873, + 0.004265223164111376, + 0.004460297524929047, + 0.004508013371378183, + 0.004556239582598209, + 0.004622767213732004, + 0.004785806871950626, + 0.0049545965157449245, + 0.005133038852363825, + 0.005330394953489304, + 0.005535339005291462, + 0.0056955344043672085, + 0.005731929559260607, + 0.005768557079136372, + 0.005856625270098448, + 0.0060506826266646385, + 0.0062511698342859745, + 0.006434508133679628, + 0.00657985545694828, + 0.0067284866236150265, + 0.006868518888950348, + 0.006990537978708744, + 0.007114724721759558, + 0.007311855908483267, + 0.007645980454981327, + 0.00799537356942892, + 0.008318326435983181, + 0.008566766045987606, + 0.008822624571621418, + 0.009145401418209076, + 0.009631679393351078, + 0.01014381367713213, + 0.01069478876888752, + 0.011316610500216484, + 0.011974586173892021, + 0.012711959891021252, + 0.013738167472183704, + 0.014847218059003353, + 0.016012778505682945, + 0.016711324453353882, + 0.017440345138311386, + 0.01820116676390171, + 0.019762948155403137, + 0.02150639519095421, + 0.023403648287057877, + 0.025760816410183907, + 0.028427796438336372, + 0.03137088194489479, + 0.034327760338783264, + 0.037407778203487396, + 0.04076414182782173, + 0.044390011578798294, + 0.04830469563603401, + 0.05256461724638939, + 0.057537030428647995, + 0.06376070529222488, + 0.07065758854150772, + 0.07816386967897415, + 0.08538728207349777, + 0.09327825903892517, + 0.10189845412969589, + 0.10915596783161163, + 0.11668524891138077, + 0.12473388016223907, + 0.13118095695972443, + 0.13683947920799255, + 0.1427420824766159, + 0.14604581892490387, + 0.14534366130828857, + 0.14464490115642548, + 0.14352932572364807, + 0.13984091579914093, + 0.13624727725982666, + 0.13274599611759186, + 0.12894530594348907, + 0.12518464028835297, + 0.12153366208076477, + 0.11663500964641571, + 0.11081801354885101, + 0.10529113560914993, + 0.09909099340438843, + 0.08989721536636353, + 0.011006423272192478, + 0.011638907715678215, + 0.011830192059278488, + 0.011451336555182934, + 0.011084613390266895, + 0.011643795296549797, + 0.01263537909835577, + 0.01371140405535698, + 0.013857835903763771, + 0.013972986489534378, + 0.013970824889838696, + 0.013519582338631153, + 0.013082913123071194, + 0.012958159670233727, + 0.013242132030427456, + 0.013532325625419617, + 0.014035293832421303, + 0.014682890847325325, + 0.015360367484390736, + 0.015673918649554253, + 0.015908092260360718, + 0.016145765781402588, + 0.01608520746231079, + 0.01602385938167572, + 0.016045529395341873, + 0.01652718149125576, + 0.017023291438817978, + 0.017365701496601105, + 0.017314797267317772, + 0.017264043912291527, + 0.017423488199710846, + 0.017877420410513878, + 0.018343176692724228, + 0.01885002851486206, + 0.019396981224417686, + 0.01995980180799961, + 0.02022475376725197, + 0.020306028425693512, + 0.02038762904703617, + 0.02071128413081169, + 0.021144112572073936, + 0.021585986018180847, + 0.022278783842921257, + 0.02307100221514702, + 0.023891393095254898, + 0.02406367100775242, + 0.02407902106642723, + 0.02409438043832779, + 0.024725820869207382, + 0.025499066337943077, + 0.02629649080336094, + 0.026758437976241112, + 0.027163023129105568, + 0.027573728933930397, + 0.028445491567254066, + 0.029434077441692352, + 0.0304570235311985, + 0.0313689224421978, + 0.032274726778268814, + 0.03320669010281563, + 0.033665869385004044, + 0.03398855775594711, + 0.034314338117837906, + 0.03500331938266754, + 0.03584909811615944, + 0.0367153137922287, + 0.03822948411107063, + 0.04016714170575142, + 0.04220300540328026, + 0.043454982340335846, + 0.0440252423286438, + 0.04460298642516136, + 0.04521733149886131, + 0.04587673023343086, + 0.04654574394226074, + 0.0475027933716774, + 0.04909081012010574, + 0.05073191225528717, + 0.05234238877892494, + 0.053589850664138794, + 0.05486704409122467, + 0.05616070330142975, + 0.056395892053842545, + 0.05663206800818443, + 0.05686923488974571, + 0.05803913250565529, + 0.05942562595009804, + 0.06084524467587471, + 0.061746153980493546, + 0.06234046444296837, + 0.06294049322605133, + 0.06343143433332443, + 0.06376621127128601, + 0.06410276144742966, + 0.06445500999689102, + 0.06487078219652176, + 0.06528924405574799, + 0.0657104030251503, + 0.0651729628443718, + 0.06457214057445526, + 0.06397686153650284, + 0.06380443274974823, + 0.06384547054767609, + 0.06388653814792633, + 0.063651442527771, + 0.06295864284038544, + 0.062273379415273666, + 0.06159890070557594, + 0.0609782375395298, + 0.060363829135894775, + 0.059755608439445496, + 0.059033505618572235, + 0.05827853083610535, + 0.009586875326931477, + 0.010092618875205517, + 0.010618560016155243, + 0.010605327785015106, + 0.010592111386358738, + 0.01061728224158287, + 0.0107435192912817, + 0.01087125577032566, + 0.011157719418406487, + 0.011598420329391956, + 0.012056530453264713, + 0.012187805026769638, + 0.012213408015668392, + 0.012239063158631325, + 0.012520777061581612, + 0.012814189307391644, + 0.013143815100193024, + 0.013616204261779785, + 0.014105573296546936, + 0.014475607313215733, + 0.014620602130889893, + 0.014767049811780453, + 0.014995312318205833, + 0.015296075493097305, + 0.015602869912981987, + 0.015824154019355774, + 0.016008686274290085, + 0.016195369884371758, + 0.017016271129250526, + 0.018009517341852188, + 0.019060742110013962, + 0.01898510567843914, + 0.018864616751670837, + 0.018769506365060806, + 0.019006120041012764, + 0.01924571581184864, + 0.019441407173871994, + 0.019392959773540497, + 0.0193446334451437, + 0.019500164315104485, + 0.0203400906175375, + 0.021216195076704025, + 0.022089287638664246, + 0.022896409034729004, + 0.023733023554086685, + 0.024332117289304733, + 0.02440914511680603, + 0.024486420676112175, + 0.02462109550833702, + 0.024859130382537842, + 0.025099467486143112, + 0.02560945600271225, + 0.026605337858200073, + 0.02763994410634041, + 0.028410587459802628, + 0.028652820736169815, + 0.02889711782336235, + 0.029516419395804405, + 0.030925441533327103, + 0.03240172564983368, + 0.03377298265695572, + 0.03475967422127724, + 0.03577519580721855, + 0.036637406796216965, + 0.03690220043063164, + 0.03716890513896942, + 0.03750794008374214, + 0.038244277238845825, + 0.03899506852030754, + 0.039822712540626526, + 0.04169372469186783, + 0.04365263879299164, + 0.045703593641519547, + 0.046846695244312286, + 0.04796139523386955, + 0.049102623015642166, + 0.049685537815093994, + 0.050144050270318985, + 0.05060678720474243, + 0.05205376073718071, + 0.05404489487409592, + 0.05611218884587288, + 0.05726396292448044, + 0.057462941855192184, + 0.057662613689899445, + 0.05818450450897217, + 0.05939794331789017, + 0.06063669174909592, + 0.06183643266558647, + 0.0625859871506691, + 0.06334462761878967, + 0.06411245465278625, + 0.06467218697071075, + 0.06521335244178772, + 0.06575904786586761, + 0.0661565288901329, + 0.06647959351539612, + 0.06680424511432648, + 0.06719478219747543, + 0.06768032163381577, + 0.06816937029361725, + 0.0684884563088417, + 0.06772825866937637, + 0.06697649508714676, + 0.0662330761551857, + 0.06568382680416107, + 0.06517278403043747, + 0.06466571241617203, + 0.06389737874269485, + 0.06291161477565765, + 0.06194106489419937, + 0.06091582775115967, + 0.059644635766744614, + 0.00776991480961442, + 0.00801712367683649, + 0.008272198028862476, + 0.00853877142071724, + 0.008815961889922619, + 0.009102151729166508, + 0.009257183410227299, + 0.009398446418344975, + 0.009557505138218403, + 0.009814277291297913, + 0.010077948682010174, + 0.010394285432994366, + 0.010798869654536247, + 0.011219202540814877, + 0.011374996975064278, + 0.011341685429215431, + 0.01130847167223692, + 0.01152020413428545, + 0.011801335960626602, + 0.012089328840374947, + 0.012249389663338661, + 0.012408753857016563, + 0.012594243511557579, + 0.012922664172947407, + 0.013259652070701122, + 0.0136256143450737, + 0.01404958963394165, + 0.014486758038401604, + 0.014790073037147522, + 0.014910400845110416, + 0.015031707473099232, + 0.015123910270631313, + 0.015193074010312557, + 0.015262553468346596, + 0.015673348680138588, + 0.01627332903444767, + 0.01689627766609192, + 0.017325306311249733, + 0.017693469300866127, + 0.018069453537464142, + 0.018300067633390427, + 0.018501443788409233, + 0.018705034628510475, + 0.019283665344119072, + 0.019931424409151077, + 0.02060094103217125, + 0.021020665764808655, + 0.02142583206295967, + 0.021838808432221413, + 0.02235114574432373, + 0.022880926728248596, + 0.023423267528414726, + 0.023833684623241425, + 0.024243738502264023, + 0.02466084249317646, + 0.02513655461370945, + 0.025624793022871017, + 0.02612251415848732, + 0.027188682928681374, + 0.02835521474480629, + 0.029571793973445892, + 0.030428243800997734, + 0.03124476969242096, + 0.03208320587873459, + 0.033268094062805176, + 0.034578900784254074, + 0.03594135493040085, + 0.037143174558877945, + 0.038301438093185425, + 0.03949582204222679, + 0.04079543054103851, + 0.04217946156859398, + 0.04361044988036156, + 0.04451911151409149, + 0.04490135982632637, + 0.045286886394023895, + 0.04630102962255478, + 0.04839282110333443, + 0.05057910457253456, + 0.05296176299452782, + 0.05579644441604614, + 0.05878284201025963, + 0.06170349568128586, + 0.06143352389335632, + 0.0611647367477417, + 0.06089711934328079, + 0.0621994324028492, + 0.06375265121459961, + 0.06534465402364731, + 0.06723403930664062, + 0.06930538266897202, + 0.07144054770469666, + 0.0734194740653038, + 0.07518068701028824, + 0.07698414474725723, + 0.07825860381126404, + 0.07747159898281097, + 0.07669251412153244, + 0.07592126727104187, + 0.07554961740970612, + 0.0751969963312149, + 0.07484602183103561, + 0.07398016005754471, + 0.07288722693920135, + 0.07181044667959213, + 0.07072535157203674, + 0.06961891800165176, + 0.06852979212999344, + 0.06754517555236816, + 0.06765954196453094, + 0.06777410954236984, + 0.06788886338472366, + 0.0671333521604538, + 0.008077305741608143, + 0.008066091686487198, + 0.008054893463850021, + 0.008125931955873966, + 0.0083838552236557, + 0.008649964816868305, + 0.009029040113091469, + 0.00950680673122406, + 0.010009854100644588, + 0.010079849511384964, + 0.01005096361041069, + 0.0100255087018013, + 0.010064047761261463, + 0.010102733969688416, + 0.010162289254367352, + 0.01028029341250658, + 0.010399667546153069, + 0.010613233782351017, + 0.010941619984805584, + 0.011280165985226631, + 0.01167391985654831, + 0.012106698006391525, + 0.012555520981550217, + 0.012503374367952347, + 0.012337366119027138, + 0.012173563241958618, + 0.012710057199001312, + 0.013296046294271946, + 0.013889580965042114, + 0.014332296326756477, + 0.014789124019443989, + 0.015122797340154648, + 0.014979484491050243, + 0.014837530441582203, + 0.014810599386692047, + 0.015022403560578823, + 0.015237237326800823, + 0.01558346301317215, + 0.01612701825797558, + 0.01668953336775303, + 0.017228402197360992, + 0.01773681491613388, + 0.018260231241583824, + 0.01848135143518448, + 0.018431173637509346, + 0.018381133675575256, + 0.01874433644115925, + 0.019434470683336258, + 0.020150016993284225, + 0.020483270287513733, + 0.02054263837635517, + 0.02060217782855034, + 0.020891547203063965, + 0.02134322188794613, + 0.02180466055870056, + 0.022434452548623085, + 0.02319895662367344, + 0.023989511653780937, + 0.024832062423229218, + 0.025725064799189568, + 0.02665018104016781, + 0.027299461886286736, + 0.02766045369207859, + 0.028026215732097626, + 0.028674669563770294, + 0.029699524864554405, + 0.030761010944843292, + 0.03182872757315636, + 0.03287560120224953, + 0.03395690768957138, + 0.03528270870447159, + 0.037277571856975555, + 0.03938521444797516, + 0.0414542555809021, + 0.04267238453030586, + 0.04392630234360695, + 0.0452130027115345, + 0.046190254390239716, + 0.04718863591551781, + 0.04820859432220459, + 0.05032429099082947, + 0.05271730571985245, + 0.05522411689162254, + 0.057896148413419724, + 0.060719072818756104, + 0.06367964297533035, + 0.06611830741167068, + 0.06797466427087784, + 0.06988313794136047, + 0.0716993436217308, + 0.07321151345968246, + 0.07475557178258896, + 0.07650307565927505, + 0.08049159497022629, + 0.08468806743621826, + 0.0891033187508583, + 0.08747407793998718, + 0.08469126373529434, + 0.08199697732925415, + 0.08058367669582367, + 0.08008042722940445, + 0.07958031445741653, + 0.07916893064975739, + 0.07896344363689423, + 0.07875849306583405, + 0.07855407148599625, + 0.0768582820892334, + 0.07519687712192535, + 0.07357138395309448, + 0.07392458617687225, + 0.07520296424627304, + 0.0765034481883049, + 0.07666272670030594, + 0.005566054955124855, + 0.005663267802447081, + 0.005750774871557951, + 0.005841121543198824, + 0.005962712224572897, + 0.0060868337750434875, + 0.0063094343058764935, + 0.006768705788999796, + 0.007261408492922783, + 0.00745965214446187, + 0.0073995632119476795, + 0.007339958101511002, + 0.007520302664488554, + 0.007774877827614546, + 0.008038070052862167, + 0.008169606328010559, + 0.008302656002342701, + 0.008430837653577328, + 0.008531240746378899, + 0.00863284058868885, + 0.008757645264267921, + 0.008921543136239052, + 0.009088507853448391, + 0.00916206557303667, + 0.00915452279150486, + 0.009146986529231071, + 0.009254656732082367, + 0.009416114538908005, + 0.00958038866519928, + 0.01003430224955082, + 0.010574407875537872, + 0.011143584735691547, + 0.011137506924569607, + 0.011095947585999966, + 0.011078336276113987, + 0.011580252088606358, + 0.012104908004403114, + 0.012585555203258991, + 0.012623301707208157, + 0.012661161832511425, + 0.012754922732710838, + 0.013078305870294571, + 0.013409888371825218, + 0.013697289861738682, + 0.013831938616931438, + 0.013967909850180149, + 0.014106829650700092, + 0.01425117626786232, + 0.014396999962627888, + 0.01467065792530775, + 0.01524593960493803, + 0.01584377884864807, + 0.016415178775787354, + 0.016891613602638245, + 0.017381878569722176, + 0.01792386919260025, + 0.018576281145215034, + 0.019252441823482513, + 0.01995195634663105, + 0.02067320980131626, + 0.02142053283751011, + 0.022137198597192764, + 0.022658584639430046, + 0.023192252963781357, + 0.023836979642510414, + 0.0250967126339674, + 0.026423024013638496, + 0.027747806161642075, + 0.028050662949681282, + 0.028356825932860374, + 0.028666332364082336, + 0.030517110601067543, + 0.032552435994148254, + 0.03472351282835007, + 0.03650782257318497, + 0.03828186169266701, + 0.040142107754945755, + 0.042512692511081696, + 0.04520721733570099, + 0.04807252064347267, + 0.050583552569150925, + 0.05277877300977707, + 0.05506925657391548, + 0.05742360278964043, + 0.05981925502419472, + 0.06231486424803734, + 0.06502824276685715, + 0.0683509111404419, + 0.07184334099292755, + 0.07551422715187073, + 0.07918594032526016, + 0.08303384482860565, + 0.08706872910261154, + 0.08964568376541138, + 0.0917763039469719, + 0.0939575657248497, + 0.09606387466192245, + 0.0980977788567543, + 0.10017473995685577, + 0.10154177993535995, + 0.10076268017292023, + 0.09998957067728043, + 0.09922238439321518, + 0.0974707379937172, + 0.09572842717170715, + 0.09401725977659225, + 0.09272624552249908, + 0.09163455665111542, + 0.09055571258068085, + 0.08939734101295471, + 0.08809400349855423, + 0.0868096575140953, + 0.08552861213684082, + 0.00558824697509408, + 0.0057097384706139565, + 0.00586372334510088, + 0.006021860986948013, + 0.00617770291864872, + 0.006336328107863665, + 0.0064949714578688145, + 0.006621173582971096, + 0.0067498283460736275, + 0.006878536660224199, + 0.0070049818605184555, + 0.007133751176297665, + 0.007364628836512566, + 0.007680465467274189, + 0.00800984725356102, + 0.00819598138332367, + 0.008343069814145565, + 0.008492798544466496, + 0.008603689260780811, + 0.008715273812413216, + 0.008825906552374363, + 0.008925482630729675, + 0.0090261809527874, + 0.009150415658950806, + 0.00932306982576847, + 0.009498980827629566, + 0.00971920881420374, + 0.009990774095058441, + 0.010269926860928535, + 0.010470939800143242, + 0.01062015350908041, + 0.010771494358778, + 0.011030709370970726, + 0.011337247677147388, + 0.011652303859591484, + 0.011697216890752316, + 0.01168440468609333, + 0.011671604588627815, + 0.012185621075332165, + 0.01277757715433836, + 0.013398290611803532, + 0.013603941537439823, + 0.01380285806953907, + 0.014004751108586788, + 0.014211829751729965, + 0.014421972446143627, + 0.01463371329009533, + 0.014826099388301373, + 0.015021014027297497, + 0.01523656863719225, + 0.015663549304008484, + 0.016102496534585953, + 0.016553722321987152, + 0.017017317935824394, + 0.017493898048996925, + 0.01797870732843876, + 0.018403077498078346, + 0.018837464973330498, + 0.01929594948887825, + 0.020181357860565186, + 0.021107392385601997, + 0.022075919434428215, + 0.0226534903049469, + 0.02323863096535206, + 0.023838886991143227, + 0.024787617847323418, + 0.025806104764342308, + 0.02686644345521927, + 0.028393758460879326, + 0.030099492520093918, + 0.03190770000219345, + 0.03340927138924599, + 0.03482154384255409, + 0.03629351407289505, + 0.03835507854819298, + 0.0408942773938179, + 0.04360157996416092, + 0.04580150917172432, + 0.04732094332575798, + 0.04889078065752983, + 0.05055992305278778, + 0.05239086598157883, + 0.0542881153523922, + 0.056461554020643234, + 0.060004375874996185, + 0.06376950442790985, + 0.06777088344097137, + 0.07043901830911636, + 0.07313589006662369, + 0.07593600451946259, + 0.08021880686283112, + 0.08524162322282791, + 0.09057892858982086, + 0.09286853671073914, + 0.09212697297334671, + 0.09139132499694824, + 0.09132544696331024, + 0.09302639961242676, + 0.09475903958082199, + 0.09648726135492325, + 0.09537933766841888, + 0.09428413957357407, + 0.09320151060819626, + 0.09318285435438156, + 0.09355349093675613, + 0.0939255952835083, + 0.09340821206569672, + 0.09173895418643951, + 0.0900995284318924, + 0.08861012756824493, + 0.08808311074972153, + 0.08755923062562943, + 0.08703846484422684, + 0.005445400718599558, + 0.005575839895755053, + 0.005746068898588419, + 0.00592149468138814, + 0.006101137958467007, + 0.0062857200391590595, + 0.006475887261331081, + 0.00665686558932066, + 0.0068421741016209126, + 0.007054041139781475, + 0.007362906821072102, + 0.0076852962374687195, + 0.007811427116394043, + 0.0076585314236581326, + 0.007508628536015749, + 0.007639636751264334, + 0.0079397177323699, + 0.008251585066318512, + 0.008420526050031185, + 0.008561192080378532, + 0.008704186417162418, + 0.00884751882404089, + 0.008993212133646011, + 0.009161536581814289, + 0.009430523961782455, + 0.009707408025860786, + 0.009919237345457077, + 0.009981024079024792, + 0.010043195448815823, + 0.010258641093969345, + 0.010668574832379818, + 0.011094891466200352, + 0.011299476027488708, + 0.01132853515446186, + 0.011357668787240982, + 0.011557623744010925, + 0.011847392655909061, + 0.012144426815211773, + 0.01239236444234848, + 0.012626570649445057, + 0.012865202501416206, + 0.012952280230820179, + 0.013005822896957397, + 0.013059585355222225, + 0.013569870963692665, + 0.0141719039529562, + 0.014800645411014557, + 0.015066085383296013, + 0.015294677577912807, + 0.01552673801779747, + 0.01582033559679985, + 0.01612456515431404, + 0.016434647142887115, + 0.01671290025115013, + 0.01699257269501686, + 0.017276925966143608, + 0.017950786277651787, + 0.018693847581744194, + 0.019467668607831, + 0.020400885492563248, + 0.021398823708295822, + 0.02244557999074459, + 0.02276602014899254, + 0.022920474410057068, + 0.023075977340340614, + 0.024037623777985573, + 0.025323841720819473, + 0.02667888253927231, + 0.02783169411122799, + 0.028891269117593765, + 0.029991185292601585, + 0.03180267661809921, + 0.034286461770534515, + 0.03696423023939133, + 0.0393294021487236, + 0.04115571826696396, + 0.0430668406188488, + 0.04547961801290512, + 0.049040500074625015, + 0.0528801865875721, + 0.05667268484830856, + 0.05864190682768822, + 0.06067955121397972, + 0.06278800219297409, + 0.06464743614196777, + 0.06655342876911163, + 0.06851561367511749, + 0.0713021531701088, + 0.07442387193441391, + 0.077682264149189, + 0.08004265278577805, + 0.08168838173151016, + 0.0833679586648941, + 0.08572240173816681, + 0.08939746022224426, + 0.09323007613420486, + 0.09679477661848068, + 0.09659124165773392, + 0.09638813138008118, + 0.09618546068668365, + 0.09523498266935349, + 0.09415043890476227, + 0.09307824075222015, + 0.0925479307770729, + 0.0924454778432846, + 0.09234312921762466, + 0.09186369180679321, + 0.09029324352741241, + 0.08874963223934174, + 0.08723241835832596, + 0.08444899320602417, + 0.08166736364364624, + 0.07897735387086868, + 0.005496160592883825, + 0.005621888674795628, + 0.0058570909313857555, + 0.006102133542299271, + 0.006291985046118498, + 0.00644471263512969, + 0.006601146887987852, + 0.006689335219562054, + 0.006767491344362497, + 0.006845341995358467, + 0.0069139436818659306, + 0.0069832331500947475, + 0.007113507017493248, + 0.0073697748593986034, + 0.007635275833308697, + 0.007871042937040329, + 0.008080527186393738, + 0.00829558726400137, + 0.008554707281291485, + 0.00883578322827816, + 0.009126094169914722, + 0.009065113961696625, + 0.008974174968898296, + 0.008919679559767246, + 0.00926085002720356, + 0.009615070186555386, + 0.00991278700530529, + 0.009983375668525696, + 0.010054466314613819, + 0.010199053213000298, + 0.010477066040039062, + 0.010762658901512623, + 0.010961012914776802, + 0.011058282107114792, + 0.011156413704156876, + 0.01140771433711052, + 0.011780201457440853, + 0.01216485071927309, + 0.012408740818500519, + 0.012577545829117298, + 0.012748648412525654, + 0.013076355680823326, + 0.01347277034074068, + 0.013881203718483448, + 0.014157814905047417, + 0.01439762394875288, + 0.014641493558883667, + 0.015502707101404667, + 0.016572359949350357, + 0.0177158173173666, + 0.017930148169398308, + 0.017937272787094116, + 0.017944397404789925, + 0.01829582080245018, + 0.018729908391833305, + 0.019174296408891678, + 0.01986859180033207, + 0.020647918805480003, + 0.021457815542817116, + 0.021635081619024277, + 0.02162003144621849, + 0.0216049924492836, + 0.022317135706543922, + 0.023350698873400688, + 0.02443213015794754, + 0.02548990584909916, + 0.026552481576800346, + 0.027659356594085693, + 0.028999362140893936, + 0.030555609613656998, + 0.03219537436962128, + 0.03408760949969292, + 0.036294642835855484, + 0.03864458203315735, + 0.04074540734291077, + 0.04215564578771591, + 0.04361468926072121, + 0.04540253058075905, + 0.04842011258006096, + 0.05163825675845146, + 0.05503002181649208, + 0.05777189880609512, + 0.06065039336681366, + 0.06367231160402298, + 0.06603754311800003, + 0.06836910545825958, + 0.07078297436237335, + 0.07387212663888931, + 0.07738690078258514, + 0.08106891065835953, + 0.08371970802545547, + 0.08507644385099411, + 0.08645518124103546, + 0.0880245640873909, + 0.09015989303588867, + 0.09234702587127686, + 0.09458721429109573, + 0.09588885307312012, + 0.09720464050769806, + 0.09853848814964294, + 0.09729974716901779, + 0.09515538811683655, + 0.09305830299854279, + 0.09103091806173325, + 0.08907593041658401, + 0.08716293424367905, + 0.0851350799202919, + 0.08227862417697906, + 0.07951802015304565, + 0.076850026845932, + 0.07490157335996628, + 0.07313138246536255, + 0.07140302658081055, + 0.004314189776778221, + 0.00446202652528882, + 0.004469240549951792, + 0.004476466216146946, + 0.004552864469587803, + 0.004682344850152731, + 0.004815507214516401, + 0.00492129335179925, + 0.005023208912461996, + 0.005126859527081251, + 0.005228151101619005, + 0.005331443622708321, + 0.005496063269674778, + 0.005807545967400074, + 0.006136681418865919, + 0.006430744659155607, + 0.006686459295451641, + 0.006952342111617327, + 0.007068032398819923, + 0.007120188791304827, + 0.007172729820013046, + 0.00712660001590848, + 0.0070686936378479, + 0.0070242746733129025, + 0.0072139957919716835, + 0.0074088419787585735, + 0.0075918324291706085, + 0.007709844969213009, + 0.007829692214727402, + 0.007952634245157242, + 0.008080026134848595, + 0.00820946041494608, + 0.008431889116764069, + 0.008777322247624397, + 0.009136906825006008, + 0.009331919252872467, + 0.009381283074617386, + 0.009430907666683197, + 0.009665966965258121, + 0.010020972229540348, + 0.010389016941189766, + 0.010774006135761738, + 0.011174827814102173, + 0.011590560898184776, + 0.012018872424960136, + 0.012461977079510689, + 0.012921418994665146, + 0.013406672514975071, + 0.013912799768149853, + 0.01443803682923317, + 0.01454435009509325, + 0.014537911862134933, + 0.01453147642314434, + 0.01474625151604414, + 0.015023785643279552, + 0.015306543558835983, + 0.015901466831564903, + 0.016613667830824852, + 0.01735776662826538, + 0.017866529524326324, + 0.018293781206011772, + 0.01873124949634075, + 0.01978190243244171, + 0.02118699625134468, + 0.022691894322633743, + 0.02390235662460327, + 0.024920489639043808, + 0.02598199062049389, + 0.026918349787592888, + 0.02773445099592209, + 0.028575297445058823, + 0.029750559478998184, + 0.0314076729118824, + 0.03315708413720131, + 0.03551659733057022, + 0.03930897265672684, + 0.04350628703832626, + 0.04760294407606125, + 0.049230169504880905, + 0.0509130135178566, + 0.05268775299191475, + 0.05739929899573326, + 0.06253216415643692, + 0.06812403351068497, + 0.07127245515584946, + 0.07398653030395508, + 0.07680395245552063, + 0.08009074628353119, + 0.0837256982922554, + 0.0875256285071373, + 0.09067033231258392, + 0.09283027052879333, + 0.0950416699051857, + 0.09723038226366043, + 0.09917598962783813, + 0.10116052627563477, + 0.1031847819685936, + 0.1035611629486084, + 0.10387129336595535, + 0.10418234765529633, + 0.10593158006668091, + 0.10835295915603638, + 0.11082968860864639, + 0.1082649677991867, + 0.09907630831003189, + 0.09066751599311829, + 0.08359700441360474, + 0.08180868625640869, + 0.08005862683057785, + 0.07834599912166595, + 0.07447517663240433, + 0.07025610655546188, + 0.06627605110406876, + 0.0056835622526705265, + 0.005778488703072071, + 0.0058168889954686165, + 0.005855544935911894, + 0.006003602407872677, + 0.006228466518223286, + 0.006461753975600004, + 0.006559248082339764, + 0.0066358293406665325, + 0.006726537831127644, + 0.006929947063326836, + 0.007139507681131363, + 0.00732079055160284, + 0.007436662912368774, + 0.007554369047284126, + 0.007696095854043961, + 0.007859318517148495, + 0.008026002906262875, + 0.008259987458586693, + 0.008523853495717049, + 0.00879614893347025, + 0.00900790374726057, + 0.009218643419444561, + 0.009430192410945892, + 0.009600629098713398, + 0.009774145670235157, + 0.00997126568108797, + 0.010242043063044548, + 0.010520173236727715, + 0.010849867947399616, + 0.011270072311162949, + 0.011706549674272537, + 0.0120396064594388, + 0.012248381972312927, + 0.012460778467357159, + 0.012791143730282784, + 0.013216962106525898, + 0.013656956143677235, + 0.013890769332647324, + 0.01401403360068798, + 0.014138391241431236, + 0.014479370787739754, + 0.014912835322320461, + 0.015359276905655861, + 0.01583067514002323, + 0.01632000505924225, + 0.01682445779442787, + 0.017189890146255493, + 0.017526019364595413, + 0.01786872372031212, + 0.018463460728526115, + 0.019132329151034355, + 0.01982542686164379, + 0.020026257261633873, + 0.020119305700063705, + 0.02021278440952301, + 0.020835893228650093, + 0.021611051633954048, + 0.022415045648813248, + 0.023504722863435745, + 0.02472705952823162, + 0.026012960821390152, + 0.026322774589061737, + 0.026238052174448967, + 0.026153599843382835, + 0.026845334097743034, + 0.02799036167562008, + 0.02918422408401966, + 0.030482228845357895, + 0.0318806916475296, + 0.03334331139922142, + 0.034967511892318726, + 0.036786407232284546, + 0.0386999174952507, + 0.040603358298540115, + 0.04237937554717064, + 0.04423307254910469, + 0.04624310880899429, + 0.048655055463314056, + 0.05119280889630318, + 0.0538804717361927, + 0.0570891872048378, + 0.0604889877140522, + 0.064091257750988, + 0.06717188656330109, + 0.07028849422931671, + 0.07354971766471863, + 0.07634273171424866, + 0.0789417177438736, + 0.0816291868686676, + 0.08391888439655304, + 0.085710309445858, + 0.08753998577594757, + 0.08916144073009491, + 0.09003059566020966, + 0.0909082368016243, + 0.09179442375898361, + 0.09180081635713577, + 0.0918039008975029, + 0.09180697053670883, + 0.09087929129600525, + 0.08962556719779968, + 0.08838912844657898, + 0.08640050143003464, + 0.08354213833808899, + 0.0807783380150795, + 0.07832704484462738, + 0.07720231264829636, + 0.07609372586011887, + 0.075001060962677, + 0.07250354439020157, + 0.0698058158159256, + 0.06720846891403198, + 0.004862659610807896, + 0.005036008078604937, + 0.005172955337911844, + 0.005313626956194639, + 0.005454210564494133, + 0.0055967653170228004, + 0.005743045825511217, + 0.0057860324159264565, + 0.005824270658195019, + 0.005889293737709522, + 0.006065427791327238, + 0.006246828939765692, + 0.006449716631323099, + 0.006681752856820822, + 0.006922136060893536, + 0.007068025879561901, + 0.007157349493354559, + 0.007247801870107651, + 0.007577993907034397, + 0.00797475129365921, + 0.008388233371078968, + 0.00846195314079523, + 0.008536320179700851, + 0.008641968481242657, + 0.008896173909306526, + 0.009157857857644558, + 0.009454495273530483, + 0.00981986615806818, + 0.010199357755482197, + 0.01043492741882801, + 0.010485082864761353, + 0.010535480454564095, + 0.010818270035088062, + 0.011291098780930042, + 0.011784590780735016, + 0.012181258760392666, + 0.012531601823866367, + 0.012892020866274834, + 0.013187125325202942, + 0.013463790528476238, + 0.013746261596679688, + 0.01410525944083929, + 0.014489530585706234, + 0.014884269796311855, + 0.015332271344959736, + 0.015800271183252335, + 0.01628255657851696, + 0.016666600480675697, + 0.017047494649887085, + 0.01743709295988083, + 0.01762446016073227, + 0.017795655876398087, + 0.01796851120889187, + 0.01868814416229725, + 0.019486015662550926, + 0.02031794935464859, + 0.020738592371344566, + 0.02112012729048729, + 0.021508682519197464, + 0.022236285731196404, + 0.02304014377295971, + 0.023873062804341316, + 0.02451166696846485, + 0.02511676400899887, + 0.025736797600984573, + 0.027014655992388725, + 0.028583234176039696, + 0.030242886394262314, + 0.03157728537917137, + 0.032751403748989105, + 0.03396918252110481, + 0.03555896878242493, + 0.03749135881662369, + 0.03952876850962639, + 0.04116467013955116, + 0.04220443218946457, + 0.04327046126127243, + 0.044930730015039444, + 0.048031285405159, + 0.05134579911828041, + 0.054855477064847946, + 0.058399736881256104, + 0.06217299401760101, + 0.06619004160165787, + 0.0682850182056427, + 0.07038935273885727, + 0.07255854457616806, + 0.07499776780605316, + 0.07757709175348282, + 0.08024512231349945, + 0.08308258652687073, + 0.08608007431030273, + 0.0891856923699379, + 0.09142724424600601, + 0.09186825901269913, + 0.09231138974428177, + 0.09276164323091507, + 0.09325861185789108, + 0.0937582403421402, + 0.0942605510354042, + 0.09346384555101395, + 0.09242482483386993, + 0.09139735996723175, + 0.0896931067109108, + 0.08748236298561096, + 0.08532611280679703, + 0.08299625664949417, + 0.08008554577827454, + 0.07727690786123276, + 0.07456676661968231, + 0.07211389392614365, + 0.06975272297859192, + 0.06746886670589447, + 0.004141747020184994, + 0.004343651235103607, + 0.004577144049108028, + 0.004823189228773117, + 0.004848053213208914, + 0.004830466117709875, + 0.0048211319372057915, + 0.004884234629571438, + 0.004948163405060768, + 0.005032883025705814, + 0.005157701205462217, + 0.005285615101456642, + 0.005516653880476952, + 0.005836617201566696, + 0.006175138056278229, + 0.006374339573085308, + 0.006535931024700403, + 0.006701619364321232, + 0.006900185719132423, + 0.007105167955160141, + 0.007317612413316965, + 0.007543670944869518, + 0.007776712998747826, + 0.008040855638682842, + 0.008364851586520672, + 0.008701902814209461, + 0.00901577714830637, + 0.009299363009631634, + 0.00959186814725399, + 0.009698892012238503, + 0.009683097712695599, + 0.009667330421507359, + 0.009862136095762253, + 0.010143048129975796, + 0.010431962087750435, + 0.010738248936831951, + 0.01105550304055214, + 0.011382130905985832, + 0.011665686964988708, + 0.011951017193496227, + 0.012243326753377914, + 0.01277650985866785, + 0.013338387943804264, + 0.013918333686888218, + 0.014295930042862892, + 0.014683771878480911, + 0.015057375654578209, + 0.015072119422256947, + 0.015086879953742027, + 0.015142945572733879, + 0.015674611553549767, + 0.016224944964051247, + 0.016785696148872375, + 0.017263498157262802, + 0.017754901200532913, + 0.018260138109326363, + 0.018777521327137947, + 0.019309567287564278, + 0.01986113004386425, + 0.020561369135975838, + 0.02128629758954048, + 0.022036787122488022, + 0.022723395377397537, + 0.023429814726114273, + 0.024158192798495293, + 0.02508002147078514, + 0.026053354144096375, + 0.027064461261034012, + 0.029228519648313522, + 0.031815338879823685, + 0.03463110700249672, + 0.03590051457285881, + 0.03654861822724342, + 0.037208423018455505, + 0.038850847631692886, + 0.041227638721466064, + 0.043749839067459106, + 0.045957937836647034, + 0.04773480072617531, + 0.04958036169409752, + 0.05174313485622406, + 0.05455433577299118, + 0.05751826614141464, + 0.06064245477318764, + 0.06393153220415115, + 0.06739900261163712, + 0.07105454057455063, + 0.0745929703116417, + 0.0782921090722084, + 0.08217469602823257, + 0.0856408104300499, + 0.0890389159321785, + 0.09257185459136963, + 0.0946502611041069, + 0.09529589116573334, + 0.09594593197107315, + 0.09723106026649475, + 0.10023309290409088, + 0.10332780331373215, + 0.10643924027681351, + 0.1034984216094017, + 0.10063885152339935, + 0.09785828739404678, + 0.09534452110528946, + 0.09296342730522156, + 0.0906417965888977, + 0.08764062076807022, + 0.0838082954287529, + 0.0801435336470604, + 0.07680291682481766, + 0.07484612613916397, + 0.0729391947388649, + 0.07108084857463837, + 0.0027693179436028004, + 0.002855916041880846, + 0.0029554401990026236, + 0.0030619900207966566, + 0.0032458214554935694, + 0.0034406897611916065, + 0.0035924133844673634, + 0.003625525627285242, + 0.0036589426454156637, + 0.003715274389833212, + 0.003791130380704999, + 0.0038685351610183716, + 0.004074116237461567, + 0.004328531678766012, + 0.004598834551870823, + 0.004582356661558151, + 0.004564616829156876, + 0.004588584881275892, + 0.004791595507413149, + 0.0050035882741212845, + 0.005191558040678501, + 0.0053293658420443535, + 0.005470830947160721, + 0.005609402433037758, + 0.005745711736381054, + 0.00588533328846097, + 0.006077196914702654, + 0.006297970190644264, + 0.006526764016598463, + 0.0067456006072461605, + 0.006967785302549601, + 0.007197287864983082, + 0.007479843217879534, + 0.007776349782943726, + 0.008076728321611881, + 0.00821584090590477, + 0.00835734885185957, + 0.008509163744747639, + 0.008717549033463001, + 0.008931037038564682, + 0.009144840762019157, + 0.009343529120087624, + 0.009546531364321709, + 0.009768472984433174, + 0.010040015913546085, + 0.01031910628080368, + 0.010597357526421547, + 0.010861190035939217, + 0.01113159116357565, + 0.011507577262818813, + 0.012131544761359692, + 0.012789344415068626, + 0.013340011239051819, + 0.01358540914952755, + 0.013835322111845016, + 0.014156057499349117, + 0.014648854732513428, + 0.015158806927502155, + 0.01567220315337181, + 0.01616128720343113, + 0.016665633767843246, + 0.017221786081790924, + 0.017935119569301605, + 0.018678000196814537, + 0.01948133483529091, + 0.020500216633081436, + 0.021572384983301163, + 0.022709503769874573, + 0.02404496632516384, + 0.025458959862589836, + 0.02695610746741295, + 0.028373438864946365, + 0.029858475551009178, + 0.0314212366938591, + 0.033587951213121414, + 0.03600774332880974, + 0.03860185667872429, + 0.041178323328495026, + 0.043837446719408035, + 0.04666828364133835, + 0.04968728870153427, + 0.05290616676211357, + 0.056333575397729874, + 0.05970890074968338, + 0.06282372027635574, + 0.06610102206468582, + 0.06954849511384964, + 0.07317236065864563, + 0.07698503136634827, + 0.08099637925624847, + 0.08728615939617157, + 0.09409146010875702, + 0.1014273390173912, + 0.10705900937318802, + 0.112267404794693, + 0.11772917956113815, + 0.12067527323961258, + 0.12111765891313553, + 0.12156166881322861, + 0.12120994180440903, + 0.11860334128141403, + 0.11605280637741089, + 0.1135571077466011, + 0.10982675105333328, + 0.10619129985570908, + 0.10267619043588638, + 0.09834839403629303, + 0.09378661960363388, + 0.08943643420934677, + 0.08517426997423172, + 0.08092518150806427, + 0.0768880546092987, + 0.07302094250917435, + 0.002680301433429122, + 0.002690564841032028, + 0.0027008678298443556, + 0.002744576195254922, + 0.0028653822373598814, + 0.002991505665704608, + 0.0030831019394099712, + 0.0031470865942537785, + 0.0032123988494277, + 0.0033281215000897646, + 0.0034593266900628805, + 0.003594922600314021, + 0.0037203647661954165, + 0.0038501836825162172, + 0.00398158747702837, + 0.004109029192477465, + 0.0042405505664646626, + 0.004361036699265242, + 0.00446690758690238, + 0.0045753479935228825, + 0.0046438658609986305, + 0.004690058995038271, + 0.004736711736768484, + 0.004954321309924126, + 0.005223267246037722, + 0.005506813991814852, + 0.005671787541359663, + 0.00583700742572546, + 0.006004327908158302, + 0.006152012851089239, + 0.006303330417722464, + 0.006432726513594389, + 0.0064737023785710335, + 0.006514939479529858, + 0.006634184624999762, + 0.006923194043338299, + 0.007224793545901775, + 0.007476891856640577, + 0.0076460689306259155, + 0.00781907420605421, + 0.008017262443900108, + 0.008243965916335583, + 0.00847708061337471, + 0.008723563514649868, + 0.008983254432678223, + 0.009250677190721035, + 0.009433582425117493, + 0.009550496935844421, + 0.009668859653174877, + 0.009883728809654713, + 0.010170357301831245, + 0.010465298779308796, + 0.010832658968865871, + 0.011257641017436981, + 0.011699295602738857, + 0.01208517700433731, + 0.012430395931005478, + 0.012785477563738823, + 0.01342002023011446, + 0.01431739330291748, + 0.01527477242052555, + 0.015962649136781693, + 0.01634984463453293, + 0.016746433451771736, + 0.01733136549592018, + 0.018172049894928932, + 0.019053509458899498, + 0.020104695111513138, + 0.021452732384204865, + 0.022891158238053322, + 0.02436620369553566, + 0.02575809508562088, + 0.027229493483901024, + 0.028846435248851776, + 0.030943550169467926, + 0.03319311887025833, + 0.035625118762254715, + 0.03996087983250618, + 0.044824328273534775, + 0.050279680639505386, + 0.05316854268312454, + 0.05568692833185196, + 0.058324601501226425, + 0.061329372227191925, + 0.064603291451931, + 0.06805197149515152, + 0.07166833430528641, + 0.0754598006606102, + 0.07945185154676437, + 0.08361203968524933, + 0.08788344264030457, + 0.0923730656504631, + 0.09699634462594986, + 0.10061383992433548, + 0.1043662503361702, + 0.10825860500335693, + 0.11212200671434402, + 0.1160871833562851, + 0.12019260227680206, + 0.12285975366830826, + 0.12439489364624023, + 0.1259492188692093, + 0.12570136785507202, + 0.12121620029211044, + 0.11689106374979019, + 0.11272025108337402, + 0.10832731425762177, + 0.10410504043102264, + 0.10004732757806778, + 0.09418635815382004, + 0.0878252312541008, + 0.08189370483160019, + 0.07647555321455002, + 0.0021653983276337385, + 0.002229252364486456, + 0.002294989535585046, + 0.0023606058675795794, + 0.0024268704000860453, + 0.002494995016604662, + 0.0025785278994590044, + 0.0026664782781153917, + 0.0027504530735313892, + 0.0027947048656642437, + 0.002839668421074748, + 0.0029201428405940533, + 0.0030630964320153, + 0.003213047981262207, + 0.003313069697469473, + 0.00337630114518106, + 0.0034407395869493484, + 0.003497180063277483, + 0.0035521225072443485, + 0.0036079282872378826, + 0.0037008938379585743, + 0.0037970298435539007, + 0.003898902330547571, + 0.004022536333650351, + 0.004150090739130974, + 0.004292771685868502, + 0.004466878715902567, + 0.004648047499358654, + 0.004788057412952185, + 0.004869451280683279, + 0.004952229093760252, + 0.0050976392813026905, + 0.0052970838733017445, + 0.0055043320171535015, + 0.005625203717499971, + 0.005701014306396246, + 0.005777847021818161, + 0.005932790692895651, + 0.00611775740981102, + 0.006308490410447121, + 0.006452868692576885, + 0.0065894643776118755, + 0.006728952284902334, + 0.006859285291284323, + 0.0069905174896121025, + 0.007124260533601046, + 0.007359955459833145, + 0.007612111512571573, + 0.00787290744483471, + 0.00840772408992052, + 0.008995534852147102, + 0.009624443016946316, + 0.009590934962034225, + 0.009522654116153717, + 0.009454859420657158, + 0.009806539863348007, + 0.01019971165806055, + 0.010608646087348461, + 0.01113413367420435, + 0.0116958599537611, + 0.012285925447940826, + 0.012918486259877682, + 0.01358567364513874, + 0.014287319965660572, + 0.015032363124191761, + 0.01581808738410473, + 0.016644883900880814, + 0.017663931474089622, + 0.01880575530230999, + 0.020021390169858932, + 0.02134896069765091, + 0.022785663604736328, + 0.024319050833582878, + 0.026011023670434952, + 0.027876971289515495, + 0.02987677790224552, + 0.03207828104496002, + 0.034543611109256744, + 0.03719841316342354, + 0.04024109989404678, + 0.04419783875346184, + 0.04854363575577736, + 0.05325944349169731, + 0.0575302392244339, + 0.06214350089430809, + 0.06712669134140015, + 0.07203514873981476, + 0.07723294198513031, + 0.08280578255653381, + 0.08856211602687836, + 0.09460677951574326, + 0.10106401145458221, + 0.10702884942293167, + 0.11217265576124191, + 0.11756367981433868, + 0.12281791865825653, + 0.12681244313716888, + 0.1309368759393692, + 0.13519546389579773, + 0.1355164647102356, + 0.13566111028194427, + 0.1358058899641037, + 0.13132266700267792, + 0.12495113164186478, + 0.11888875812292099, + 0.11342821270227432, + 0.10868453234434128, + 0.10413923114538193, + 0.09970667213201523, + 0.09454379975795746, + 0.08964826166629791, + 0.0850062221288681, + 0.0792681947350502, + 0.0024069345090538263, + 0.0024591260589659214, + 0.0025128591805696487, + 0.002603731583803892, + 0.00269789039157331, + 0.002789401449263096, + 0.002867753617465496, + 0.002948306966573, + 0.003029677551239729, + 0.0031119624618440866, + 0.003196482080966234, + 0.003229886293411255, + 0.0032469364814460278, + 0.003264076542109251, + 0.0033778701908886433, + 0.0034976296592503786, + 0.003612474538385868, + 0.0036894113291054964, + 0.003767986549064517, + 0.003871130058541894, + 0.0040172128938138485, + 0.004168808925896883, + 0.0043206531554460526, + 0.004473263397812843, + 0.0046312641352415085, + 0.004768752492964268, + 0.004898791667073965, + 0.005032376851886511, + 0.005064669530838728, + 0.005077089183032513, + 0.005089539103209972, + 0.005320522468537092, + 0.005571181420236826, + 0.0058222804218530655, + 0.005927718710154295, + 0.006035066209733486, + 0.006143842823803425, + 0.006251839455217123, + 0.006361734122037888, + 0.006509153638035059, + 0.0067798369564116, + 0.0070617771707475185, + 0.00732622342184186, + 0.007528034504503012, + 0.007735405117273331, + 0.007931499741971493, + 0.008098069578409195, + 0.008268137462437153, + 0.008532161824405193, + 0.00897311046719551, + 0.009436849504709244, + 0.009810572490096092, + 0.009998610243201256, + 0.010190251283347607, + 0.010488588362932205, + 0.01098755095154047, + 0.011510249227285385, + 0.012076609767973423, + 0.012710368260741234, + 0.013377383351325989, + 0.014017126522958279, + 0.014529370702803135, + 0.015060335397720337, + 0.015635304152965546, + 0.016317686066031456, + 0.01702985353767872, + 0.01783626526594162, + 0.019049951806664467, + 0.020346224308013916, + 0.021697504445910454, + 0.02258075773715973, + 0.023499969393014908, + 0.024456597864627838, + 0.02629179134964943, + 0.02831609919667244, + 0.030496271327137947, + 0.03297962248325348, + 0.03569795936346054, + 0.038640353828668594, + 0.041891735047101974, + 0.04545217752456665, + 0.04931521788239479, + 0.053606290370225906, + 0.0583769716322422, + 0.0635722205042839, + 0.06887570023536682, + 0.0738227516412735, + 0.07912512868642807, + 0.0847037062048912, + 0.08987323194742203, + 0.09535825252532959, + 0.10117803514003754, + 0.10611263662576675, + 0.11114943772554398, + 0.11642531305551529, + 0.11962644755840302, + 0.12173663079738617, + 0.12388402968645096, + 0.1252322643995285, + 0.12539361417293549, + 0.125555157661438, + 0.12525908648967743, + 0.12214302271604538, + 0.11910446733236313, + 0.11614150553941727, + 0.11242127418518066, + 0.10867428034543991, + 0.10505218058824539, + 0.10114123672246933, + 0.09703496098518372, + 0.09309539943933487, + 0.08871499449014664, + 0.08237294852733612, + 0.002171532716602087, + 0.0022854539565742016, + 0.0023657367564737797, + 0.0023991509806364775, + 0.0024330373853445053, + 0.002495238557457924, + 0.0025704705622047186, + 0.002647971035912633, + 0.0027519753202795982, + 0.002860897220671177, + 0.002970157889649272, + 0.0030676578171551228, + 0.0031683584675192833, + 0.003241481725126505, + 0.0032742833718657494, + 0.0033074168022722006, + 0.003415595507249236, + 0.0035729596856981516, + 0.0037375737447291613, + 0.003798752324655652, + 0.003836986841633916, + 0.003875605994835496, + 0.003964189440011978, + 0.004054971970617771, + 0.004153236746788025, + 0.004284204449504614, + 0.0044193025678396225, + 0.004550070967525244, + 0.004663856700062752, + 0.004780488088726997, + 0.004936788696795702, + 0.0051503716967999935, + 0.0053731948137283325, + 0.0055454326793551445, + 0.005669326521456242, + 0.005795987788587809, + 0.005924571305513382, + 0.006055454723536968, + 0.0061892298981547356, + 0.00637009646743536, + 0.00657542934641242, + 0.006787380203604698, + 0.006932539399713278, + 0.007057858165353537, + 0.007185443304479122, + 0.007350254338234663, + 0.007527296897023916, + 0.0077086035162210464, + 0.007941941730678082, + 0.008191963657736778, + 0.008449854329228401, + 0.008793341927230358, + 0.009165375493466854, + 0.009553149342536926, + 0.009863197803497314, + 0.010165098123252392, + 0.010476240888237953, + 0.01105673797428608, + 0.011731121689081192, + 0.012446636334061623, + 0.013216870836913586, + 0.014038121327757835, + 0.014910400845110416, + 0.015314619988203049, + 0.01552727073431015, + 0.015742873772978783, + 0.016497798264026642, + 0.017603712156414986, + 0.01878376491367817, + 0.019897695630788803, + 0.020955197513103485, + 0.022068902850151062, + 0.023501642048358917, + 0.02537555992603302, + 0.02739889547228813, + 0.029577158391475677, + 0.03191386163234711, + 0.034435171633958817, + 0.037071485072374344, + 0.039484791457653046, + 0.042055197060108185, + 0.04480438306927681, + 0.04867977276444435, + 0.0528903566300869, + 0.057465147227048874, + 0.06288052350282669, + 0.06890426576137543, + 0.07550506293773651, + 0.08129717409610748, + 0.08665446192026138, + 0.09236478060483932, + 0.09750597178936005, + 0.10156676918268204, + 0.105796679854393, + 0.11022299528121948, + 0.11492723226547241, + 0.11983224004507065, + 0.12494660168886185, + 0.12645207345485687, + 0.12770257890224457, + 0.12896545231342316, + 0.12960068881511688, + 0.12991270422935486, + 0.13022546470165253, + 0.12872177362442017, + 0.12428044527769089, + 0.11999234557151794, + 0.11582581698894501, + 0.11144492030143738, + 0.10722970962524414, + 0.10317394137382507, + 0.09729805588722229, + 0.0911116823554039 + ] +} diff --git a/src/objects/milky-way-pleiades-dust/source/manifest.json b/src/objects/milky-way-pleiades-dust/source/manifest.json new file mode 100644 index 00000000000..7a3f3dc5d00 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/manifest.json @@ -0,0 +1,496 @@ +{ + "schema": "cssearth-volume-source-manifest@2", + "pathBase": "repository", + "inputs": [ + { + "id": "member-reddening-gaia-placement", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/placement-constraint.json", + "title": "Member reddening and Gaia DR3 conditional 136 pc transition", + "credit": "Breger (1986); Gaia Collaboration; Lindegren et al.; Hunt and Reffert (2023)", + "sourceBinding": { + "kind": "local", + "reason": "Authored summary of the retained 2026-10-25 fit, with bibliography, cuts and conditional intervals. Thickness and individual bright-star depths remain unresolved; model registration is adopted." + }, + "dependencies": [] + }, + { + "id": "edenhofer-grid-transport", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/edenhofer-wide-density.f32", + "origin": "https://zenodo.org/records/10658339", + "generator": "packages/bake/authoring/m45/dust/acquisition/edenhofer.mts", + "title": "Native Edenhofer mean sampled over 190 \u00d7 200 \u00d7 200 pc", + "credit": "Edenhofer et al. (2024); native interpolation and regional sampling.", + "sourceBinding": { + "kind": "local", + "reason": "One-pc numerical sampling of the native log-density HEALPix and radial interpolation; frame, shape and coverage are in .local/wide-science-grid.json." + }, + "dependencies": [], + "sourceUrl": "https://zenodo.org/records/10658339" + }, + { + "id": "white-2017-b-star-illumination", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/stellar-inputs.json", + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/stellar-inputs.json", + "sourceUrl": "https://arxiv.org/html/1708.07462", + "title": "White et al. 2017, Table 1", + "credit": "White et al. (2017)", + "sourceBinding": { + "kind": "local", + "reason": "Published temperatures and radii, distance-rescaled and converted to blackbody spectral luminosities during Step 1; individual depths assumed." + }, + "dependencies": [], + "acquisition": "Numerical transcription of White et al. (2017), Table 1: temperatures, radii and reference distances, preserved before conditional distance scaling." + }, + { + "id": "draine-2003-grains", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/draine-rv31.txt", + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/draine-rv31.txt", + "sourceUrl": "https://www.astro.princeton.edu/~draine/dust/dustmix.html", + "title": "Draine diffuse Milky Way R_V=3.1 grain model", + "credit": "Draine (2003)", + "sourceBinding": { + "kind": "local", + "reason": "Published extinction, albedo and asymmetry interpolated at I/V/B wavelengths; HG is an approximation to its scattering phase." + }, + "dependencies": [], + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "allwise-native", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/wise-points.json", + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "title": "NASA/JPL-Caltech/UCLA AllWISE W3/W4 Atlas data", + "credit": "NASA/JPL-Caltech/UCLA AllWISE W3/W4 Atlas data", + "sourceBinding": { + "kind": "catalogued", + "references": [ + { + "catalogueId": "allwise-pleiades-infrared", + "role": "material", + "evidence": "src/objects/milky-way-pleiades-dust/README.md" + } + ] + }, + "generator": "packages/telescope-cli/authoring/m45/wise.mts", + "dependencies": [] + }, + { + "id": "spitzer-native", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/spitzer-products.json", + "origin": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "title": "NASA/JPL-Caltech Spitzer MIPS program 58, PI Rieke", + "credit": "NASA/JPL-Caltech Spitzer MIPS program 58, PI Rieke", + "sourceBinding": { + "kind": "catalogued", + "references": [ + { + "catalogueId": "spitzer-mips-pleiades-58", + "role": "material", + "evidence": "src/objects/milky-way-pleiades-dust/README.md" + } + ] + }, + "generator": "packages/telescope-cli/authoring/m45/spitzer.mts", + "dependencies": [] + }, + { + "id": "published-galactic-field", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/isrf/isrf-mmpisrf_0.00.gz", + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/isrf/isrf-mmpisrf_0.00.gz", + "sourceUrl": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "title": "Draine et al. 2021 modified-MMP U1 illuminating field", + "credit": "Draine et al. 2021 modified-MMP U1 illuminating field", + "sourceBinding": { + "kind": "catalogued", + "references": [ + { + "catalogueId": "draine-2021-mmmp-isrf", + "role": "material", + "evidence": "src/objects/milky-way-pleiades-dust/README.md" + } + ] + }, + "dependencies": [], + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "named-stars-csv", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/named-stars.csv", + "title": "Preserved numerical input: named-stars.csv. Scientific origin and processing are described in README.md.", + "credit": "ESA Hipparcos; van Leeuwen (2007): measured sky positions.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: named-stars.csv. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/named-stars.csv", + "sourceUrl": "https://doi.org/10.1051/0004-6361:20078357", + "acquisition": "Hipparcos numerical sky-position extract for the named Pleiades stars; measured coordinates retained, normal-depth plane applied only by the physics input reader." + }, + { + "id": "wide-science-grid-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/wide-science-grid.json", + "title": "Preserved numerical input: wide-science-grid.json. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024): native HEALPix extraction and conditional normal-depth registration.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: wide-science-grid.json. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/wide-science-grid.json", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "extinction-columns-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/extinction/columns.json", + "title": "Preserved numerical input: extinction/columns.json. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024) and Leike et al. (2020): registered extinction columns.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: extinction/columns.json. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/extinction/columns.json", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "extinction-edenhofer-column-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/extinction/edenhofer-column.f32", + "title": "Preserved numerical input: extinction/edenhofer-column.f32. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024) and Leike et al. (2020): registered extinction columns.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: extinction/edenhofer-column.f32. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/extinction/edenhofer-column.f32", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "extinction-leike-column-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/extinction/leike-column.f32", + "title": "Preserved numerical input: extinction/leike-column.f32. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024) and Leike et al. (2020): registered extinction columns.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: extinction/leike-column.f32. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/extinction/leike-column.f32", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "member-reddening-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/member-reddening.json", + "title": "Preserved numerical input: member-reddening.json. Scientific origin and processing are described in README.md.", + "credit": "Breger (1986) member reddening; Gaia DR3 astrometry; conditional sample described in placement-constraint.json.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: member-reddening.json. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/member-reddening.json", + "sourceUrl": "https://adsabs.harvard.edu/pdf/1986ApJ...309..311B", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "coarse-transmission-bin", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/coarse-transmission.bin", + "title": "Preserved numerical input: coarse-transmission.bin. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024): coarse observer/target extinction integration.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: coarse-transmission.bin. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/coarse-transmission.bin", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved coarse Edenhofer observer/target integration, quantized at tau_V \u00d7 1000. The current transmission producer adds the registered fine-field integral and subtracts the corresponding coarse partition." + }, + { + "id": "column-mips24-validity-u8", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/MIPS24-validity.u8", + "title": "Preserved numerical input: column/MIPS24-validity.u8. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/MIPS24-validity.u8. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-nhprior-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/NHprior.f32", + "title": "Preserved numerical input: column/NHprior.f32. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/NHprior.f32. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-wise3-validity-u8", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/WISE3-validity.u8", + "title": "Preserved numerical input: column/WISE3-validity.u8. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/WISE3-validity.u8. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-wise4-validity-u8", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/WISE4-validity.u8", + "title": "Preserved numerical input: column/WISE4-validity.u8. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/WISE4-validity.u8. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-column-nh-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/column-NH.f32", + "title": "Preserved numerical input: column/column-NH.f32. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/column-NH.f32. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/prepare.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-fcoarse-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/fcoarse.f32", + "title": "Preserved numerical input: column/fcoarse.f32. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/fcoarse.f32. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "column-ir-intake-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/column/ir-intake.json", + "title": "Preserved numerical input: column/ir-intake.json. Scientific origin and processing are described in README.md.", + "credit": "NASA/JPL-Caltech/UCLA AllWISE; NASA/JPL-Caltech Spitzer MIPS; conditional extinction and stellar-heating processing.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: column/ir-intake.json. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/column/intake.mts", + "dependencies": [ + "allwise-native", + "spitzer-native", + "white-2017-b-star-illumination", + "draine-2003-grains" + ], + "origin": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "sourceUrl": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + }, + { + "id": "depth-edenhofer-depth-prior-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/depth/edenhofer-depth-prior.f32", + "title": "Preserved numerical input: depth/edenhofer-depth-prior.f32. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024): native HEALPix extraction and conditional normal-depth registration.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: depth/edenhofer-depth-prior.f32. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/depth/edenhofer-depth-prior.f32", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "depth-grid-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/depth/grid.json", + "title": "Preserved numerical input: depth/grid.json. Scientific origin and processing are described in README.md.", + "credit": "Edenhofer et al. (2024): native HEALPix extraction and conditional normal-depth registration.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: depth/grid.json. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/depth/grid.json", + "sourceUrl": "https://zenodo.org/records/10658339", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "iris-iris100-512-f32", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/iris/iris100-512.f32", + "title": "Preserved numerical input: iris/iris100-512.f32. Scientific origin and processing are described in README.md.", + "credit": "Miville-Desch\u00eanes and Lagache (2005), IRIS; CDS HiPS2FITS.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: iris/iris100-512.f32. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/iris/iris100-512.f32", + "sourceUrl": "https://doi.org/10.1086/427938", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "iris-iris100-512-json", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/iris/iris100-512.json", + "title": "Preserved numerical input: iris/iris100-512.json. Scientific origin and processing are described in README.md.", + "credit": "Miville-Desch\u00eanes and Lagache (2005), IRIS; CDS HiPS2FITS.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: iris/iris100-512.json. Scientific origin and processing are described in README.md." + }, + "dependencies": [], + "origin": "https://earth-assets.lowpoly.cc/source-cache/milky-way-pleiades-dust/src/objects/milky-way-pleiades-dust/source/inputs/iris/iris100-512.json", + "sourceUrl": "https://doi.org/10.1086/427938", + "acquisition": "Preserved numerical extract of the cited source, restored from the source mirror. The source URL identifies the scientific material; the mirror holds this processed file." + }, + { + "id": "optical-galactic-field", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/inputs/isrf/optical-field.json", + "title": "Modified-MMP optical mean intensity and unit checks", + "credit": "Draine et al. (2021), modified-MMP spectrum at U = 1; optical interpolation and unit checks.", + "sourceBinding": { + "kind": "local", + "reason": "Preserved numerical input: isrf/isrf.json. Scientific origin and processing are described in README.md." + }, + "generator": "packages/bake/authoring/m45/dust/physics/isrf.mts", + "dependencies": [ + "published-galactic-field" + ], + "origin": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "sourceUrl": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz" + }, + { + "id": "model", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/model.json", + "title": "Regional prepared output binding", + "credit": "Conditional Pleiades model parameters; published measurements and assumptions described in README.md.", + "sourceBinding": { + "kind": "local", + "reason": "Regional prepared output binding" + }, + "dependencies": [] + }, + { + "id": "parameters", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/parameters.json", + "title": "Current physical, display and reference-projection parameters", + "credit": "Conditional Pleiades model parameters; published measurements and assumptions described in README.md.", + "sourceBinding": { + "kind": "local", + "reason": "Current physical, display and reference-projection parameters" + }, + "dependencies": [] + }, + { + "id": "depth-profiles", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/depth-profiles.json", + "title": "Registered native Edenhofer sight-line profiles; conditional depth realization", + "credit": "Conditional Pleiades model parameters; published measurements and assumptions described in README.md.", + "sourceBinding": { + "kind": "local", + "reason": "Registered native Edenhofer sight-line profiles; conditional depth realization" + }, + "dependencies": [] + }, + { + "id": "optical-reference", + "datasetId": "smooth-dust", + "path": "src/objects/milky-way-pleiades-dust/source/optical-reference.json", + "title": "Published Gibson and Nordsieck B-band surface-brightness comparison", + "credit": "Conditional Pleiades model parameters; published measurements and assumptions described in README.md.", + "sourceBinding": { + "kind": "local", + "reason": "Published Gibson and Nordsieck B-band surface-brightness comparison" + }, + "dependencies": [] + } + ] +} diff --git a/src/objects/milky-way-pleiades-dust/source/model.json b/src/objects/milky-way-pleiades-dust/source/model.json new file mode 100644 index 00000000000..4af3a8c14b4 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/model.json @@ -0,0 +1,8 @@ +{ + "schema": "cssearth-volume-dataset-manifest@1", + "outputs": { + "smooth-dust": { + "volume": "prepared/smooth-dust/volume.json" + } + } +} diff --git a/src/objects/milky-way-pleiades-dust/source/optical-reference.json b/src/objects/milky-way-pleiades-dust/source/optical-reference.json new file mode 100644 index 00000000000..54a45630e80 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/optical-reference.json @@ -0,0 +1,103 @@ +{ + "source": { + "doi": "https://doi.org/10.1086/374589", + "authorPDF": "http://physics.wku.edu/~gibson/offprints/gibson_2003_pleiades_phot_color.pdf", + "section": "3.4, author preprint pages8–9; Figures7–9", + "passband": "Burrell Schmidt BJ, central4400Angstrom; broad3600–5200Angstrom", + "extentDegrees": [ + 5, + 1.7 + ] + }, + "measurement": "Published regional surface-brightness ranges, converted algebraically; not new aperture photometry or a recovered native FITS.", + "intensities": [ + { + "name": "generalCoreBright", + "muBMagPerArcsec2": 22.1, + "radianceWm2SrNm": 3.880165647233386e-09, + "modelRadianceUnits": 0.38801656472333856 + }, + { + "name": "generalCoreFaint", + "muBMagPerArcsec2": 22.9, + "radianceWm2SrNm": 1.8571640419624494e-09, + "modelRadianceUnits": 0.18571640419624494 + }, + { + "name": "oneDegreeCirrus", + "muBMagPerArcsec2": 25, + "radianceWm2SrNm": 2.684418767051779e-10, + "modelRadianceUnits": 0.02684418767051779 + }, + { + "name": "surroundBright", + "muBMagPerArcsec2": 24.2, + "radianceWm2SrNm": 5.608545743593257e-10, + "modelRadianceUnits": 0.056085457435932566 + }, + { + "name": "surroundFaint", + "muBMagPerArcsec2": 25.4, + "radianceWm2SrNm": 1.8571640419624493e-10, + "modelRadianceUnits": 0.018571640419624492 + }, + { + "name": "skyZeroCheck1sigma", + "muBMagPerArcsec2": 25.6, + "radianceWm2SrNm": 1.5447217670989612e-10, + "modelRadianceUnits": 0.015447217670989612 + }, + { + "name": "binned5sigmaSensitivityNotCirrus", + "muBMagPerArcsec2": 27.6, + "radianceWm2SrNm": 2.448219012921646e-11, + "modelRadianceUnits": 0.0024482190129216457 + } + ], + "ratios": { + "generalCoreOverOneDegreeCirrus": [ + 6.918309709189375, + 14.454397707459258 + ], + "oneDegreeCirrusOverGeneralCore": [ + 0.06918309709189373, + 0.14454397707459254 + ], + "generalCoreOverSurroundBroad": [ + 3.3113112148259134, + 20.892961308540343 + ] + }, + "uncertainties": { + "absoluteCalibrationPercent": 8, + "airmassExtinctionAdditionalPercent": [ + 6, + 10 + ], + "frameRelativePercentLessThan": 5, + "globalSkyZeroApprox1sigmaMagPerArcsec2": 25.6, + "largeScaleFieldArtifactMagPerArcsec2": [ + 25, + 26 + ], + "oneDegreeCirrusAdditiveZeroFraction": 0.5754399373371559, + "zeroShiftIllustrationCoreOverCirrus": [ + 4.756607642683374, + 32.690210386424894 + ], + "zeroShiftIllustrationNature": "Conservative common additive +/-published1sigma sky-level illustration, not statistical confidence interval; spatial gradients add further uncertainty." + }, + "comparison": { + "core": "General nebula inside Electra–Maia–Merope–Alcyone quadrilateral, avoiding stars and innermostfewarcmin PSF residuals.", + "cirrus": "Around1degree from Merope/cluster; other surrounding structures span24.2–25.4.", + "modelPassband": "Use prepared blue440nm/BJ approximation and label finite-bandpass mismatch; do not use RGB luma.", + "reject": "If physical model ratio misses broad data range, report geometry/column/illumination mismatch; exposure cannot change a radiance ratio.", + "appliedCalibration": "Physical core and surrounding radiance compared before display encoding, without local gain, illumination, column or sky-offset fitting. The display uses channel gains and uniform exponential exposure 10. The source ranges check broad regional consistency, not an exact aperture ratio." + }, + "limits": [ + "Faintest supposedlyblank areas set tozero; emission larger than mosaic is removed.", + "At27.6mag sensitivity refers to small-scale contrast after30arcsec binning, not absolute surrounding nebula brightness.", + "Brightstarzones cancontainPSF residuals; do not use IC349 or saturatedcores to normalize generalnebula.", + "PaperI primary text recovered; native calibrated FITS not found in bounded search." + ] +} diff --git a/src/objects/milky-way-pleiades-dust/source/parameters.json b/src/objects/milky-way-pleiades-dust/source/parameters.json new file mode 100644 index 00000000000..dd9ee96d444 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/parameters.json @@ -0,0 +1,223 @@ +{ + "schema": "cssearth-pleiades-dust-model@1", + "reference": { + "frame": { + "referenceFrame": "sun-icrf", + "epochJdTt": 2461286.5, + "originM": [ + 2104147913154344000, + 3200797260382557000, + 1714132797755189800 + ], + "localToReferenceXyzw": [ + 0.15591687851693786, + 0.5210156915859083, + 0.8039586074055388, + 0.24058913876843827 + ], + "metersPerUnit": 30856775814913670, + "boundsUnits": { + "min": [ + -149.04338038818852, + -146.68889103799495, + -107.0711252145712 + ], + "max": [ + 188.09798138188418, + 158.49674529871027, + 184.97422536764634 + ] + } + }, + "eye": [ + -4.148197490488787e-15, + -2.592623431555492e-16, + -18.8492331902181 + ], + "axes": { + "right": [ + -0.9757103621331191, + -0.2190645777529079, + -1.5755479166919476e-15 + ], + "down": [ + 0.2190645777529079, + -0.975710362133118, + 3.981003666808697e-16 + ], + "back": [ + 1.6244881170838024e-15, + -4.328391383992341e-17, + -1.0000000000000013 + ] + } + }, + "display": { + "method": "one global exponential optical exposure of the calibrated linear scattering field", + "exposure": 10, + "gains": [ + 0.158881742875235, + 0.10473059847135512, + 0.17729790044727262 + ] + }, + "cellProjections": [ + { + "cell": "core-0-0-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 5.271684453114548 + }, + { + "cell": "core-1-0-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 5.271684453114554 + }, + { + "cell": "core-0-1-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 5.271684453114551 + }, + { + "cell": "core-1-1-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 5.2716844531145535 + }, + { + "cell": "core-0-0-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.60322511993958 + }, + { + "cell": "core-1-0-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.603225119939583 + }, + { + "cell": "core-0-1-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.603225119939582 + }, + { + "cell": "core-1-1-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.603225119939583 + }, + { + "cell": "core-0-0-2", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.912950389056818 + }, + { + "cell": "core-1-0-2", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.912950389056821 + }, + { + "cell": "core-0-1-2", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.912950389056819 + }, + { + "cell": "core-1-1-2", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 4.91295038905682 + }, + { + "cell": "surround-0-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 70.4969462418125 + }, + { + "cell": "surround-1-0", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 70.49694624181247 + }, + { + "cell": "surround-0-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 70.4969462418125 + }, + { + "cell": "surround-1-1", + "eye": [ + -6.092665064155406e-15, + -3.1273520143138124e-15, + -18.849233190218104 + ], + "spanPc": 70.49694624181242 + } + ], + "columnPrior": { + "precomputedGridXY": 9216, + "fixedColumnSampling": 64, + "nearRampEbvMedian": 0.05103519457220329, + "nearRampEbvP90": 0.10179734524767858, + "nearRamp": "Adopted linear median-to-p90 column ramp, capped at0.35; uniform columns have no extra near component.", + "sourceColumnCalls": 13312 + }, + "assumptions": [ + "Foreground reference depth 136 pc; bright-star normal depths 136.7 pc are adopted.", + "One fixed Earth-reference image and illumination per element.", + "Infrared column is conditional on the declared heating prior; not a unique mass inversion." + ] +} diff --git a/src/objects/milky-way-pleiades-dust/source/placement-constraint.json b/src/objects/milky-way-pleiades-dust/source/placement-constraint.json new file mode 100644 index 00000000000..f916c9e68c1 --- /dev/null +++ b/src/objects/milky-way-pleiades-dust/source/placement-constraint.json @@ -0,0 +1,55 @@ +{ + "title": "Conditional Pleiades excess-column distance from member reddening and Gaia DR3", + "analysisDate": "2026-10-25", + "evidenceKind": "authored-analysis-summary", + "sources": [ + { "title": "Breger 1986, Table 1", "url": "https://adsabs.harvard.edu/pdf/1986ApJ...309..311B" }, + { "title": "Gaia DR3 astrometry", "url": "https://doi.org/10.1051/0004-6361/202243940", "retrieval": "AIP Gaia TAP mirror, https://gaia.aip.de/tap/" }, + { "title": "Lindegren et al. parallax zero point", "url": "https://doi.org/10.1051/0004-6361/202039653" }, + { "title": "Hunt and Reffert 2023 membership", "url": "https://cdsarc.cds.unistra.fr/viz-bin/cat/J/A+A/673/A114" }, + { "title": "Gibson and Nordsieck 2003 II scattering geometry", "url": "https://doi.org/10.1086/374590", "erratum": "https://doi.org/10.1086/503897" } + ], + "measurements": { + "transcribedReddenings": 91, + "matchedDr3Sources": 91, + "withParallax": 87, + "selectedMembers": 39, + "classifiedDistanceLabels": 37, + "additionalReddeningLabels": 8, + "formalDistanceErrorMedianPc": 0.37, + "formalDistanceError16To84Pc": [0.27, 0.56], + "selection": "Catalogue members, RUWE < 1.4, parallax S/N > 50, no duplicate or non-single-star solution, image multi-peak fraction <= 2%, valid zero-point correction; published reddening caveats excluded.", + "distanceMethod": "1000 / (parallax - zero point), using high-S/N geometric parallaxes rather than GSP-Phot fitted distances." + }, + "fit": { + "quantity": "Additional-column transition, not either separately resolved scattering sheet", + "model": "d = d0 + a*x + b*y; three regional coverage probabilities and a Gaussian transition convolved with stellar distance errors", + "coordinates": "x east, y north, pc projected at 134.84134308 pc; ICRS origin RA 56.67978318 deg, Dec +24.10845447 deg", + "labels": "E(B-V) >= 0.07 additional reddening; <= 0.05 lightly reddened; two ambiguous retained stars omitted", + "maximumCenterPc": 136.08, + "maximumSlopesPcPerPc": [-0.46, 0.49], + "medianCenterPc": 136.0, + "central68PercentPc": [135.25, 136.50], + "central95PercentPc": [132.25, 137.75], + "priors": "Uniform 115 < d0 < 155 pc, -5 < a,b < 5 pc/pc, regional coverage in [0,1]; fixed 1% label error", + "uncertaintyMeaning": "Conditional on plane, labels, priors, thin transition and adopted errors; not a complete spatial astrometric covariance or photometric-systematics posterior.", + "systematics": "Coherent +/-0.02 mas offset shifts the fitted center by about +/-0.37 pc. Cool-star reddening systematics and label choices materially broaden or shift the fit." + }, + "notMeasured": [ + "Secure tilt, curvature, physical thickness or two sheets separated by 0.35-0.7 pc.", + "Precise individual B-star depths: several bright stars have poor Gaia solutions or no parallax.", + "A universal cloud edge or full column: low-column patches can remain lightly reddened behind the transition." + ], + "adoptedRealization": { + "normalDepthAnchorPc": 136.0, + "edenhoferGlobalShiftPc": -0.766, + "brightStarNormalDepthPc": 136.7, + "meaning": "Conditional registration and stellar plane, not new measurements. Native profile shapes remain; map widths include smoothing and posterior uncertainty." + }, + "localEvidence": { + "report": ".local/PLACEMENT.md", + "matchedStars": ".local/placement/matched-members.csv", + "posterior": ".local/placement/posterior-grid.json", + "limitation": "Original tables, queries, fit drivers and plots remain local research evidence. The published prepared display can be restored without them." + } +} diff --git a/src/objects/milky-way/inventory.json b/src/objects/milky-way/inventory.json index 31d2a75693e..9bdadc2eb7e 100644 --- a/src/objects/milky-way/inventory.json +++ b/src/objects/milky-way/inventory.json @@ -22,8 +22,8 @@ { "location": "prepared", "filename": "members.json", - "bytes": 105526, - "sha256": "c203394c4a80b8904a2e779d7fa72dd771aa5e2d585cd618f1582794e4d5b625" + "bytes": 105613, + "sha256": "29989a54f21858d11fa1348ab608fee1ac122204309babf19f96692991bc4e15" }, { "location": "prepared", diff --git a/src/objects/observable-universe/inventory.json b/src/objects/observable-universe/inventory.json index 504f194f0c3..310d790e3e4 100644 --- a/src/objects/observable-universe/inventory.json +++ b/src/objects/observable-universe/inventory.json @@ -52,8 +52,8 @@ { "location": "prepared", "filename": "world-context.json", - "bytes": 60064323, - "sha256": "6591c1cc036fba861064689a65ebec20008c3cb8898d01c3b78928e451d91f76" + "bytes": 60064546, + "sha256": "928e9dd5c731deb11736ac3b32236e1e84a44ab82c5df3383259d2bea4fa1116" }, { "location": "prepared", diff --git a/src/objects/pleione/inventory.json b/src/objects/pleione/inventory.json index 70968357ef4..f67cb05d0ac 100644 --- a/src/objects/pleione/inventory.json +++ b/src/objects/pleione/inventory.json @@ -179,7 +179,7 @@ "location": "prepared", "filename": "datasets.json", "bytes": 12633, - "sha256": "5d151df278a2440117cf50722fd925e8f0d515c148e5dad418a544f9cd7b97c3" + "sha256": "b8ee551d1566c9c2216779c4b7f50fb676d777c740c26745e7b44dd7afac76d6" }, { "location": "prepared", @@ -226,8 +226,8 @@ { "location": "prepared", "filename": "minimaps/color-brightness.webp", - "bytes": 1426, - "sha256": "f19ce53e81d438c28ead0b70bd5e70e67a06657034e35b90af42fd8537e83e0e" + "bytes": 1488, + "sha256": "1956329ca9435ae943eac56ed5777cee0720c7160e44304b195d509c7f5b74de" }, { "location": "prepared", @@ -239,7 +239,7 @@ "location": "prepared", "filename": "runtime.json", "bytes": 82111, - "sha256": "806fafe5aad5969b085bf60f597409cf58cc25ae9f4541d86a602144edb6f638" + "sha256": "cb09288660dd1845df5127dedd6beb31c8d5fad48e5d1ebd31582ee458e72bc2" }, { "location": "prepared", diff --git a/src/objects/pleione/object.json b/src/objects/pleione/object.json index f98cbfd424d..c49e55830a5 100644 --- a/src/objects/pleione/object.json +++ b/src/objects/pleione/object.json @@ -128,7 +128,7 @@ "name": "Pleione", "classification": "star", "color": "#b7c4ff", - "distanceAu": 24152795.2, + "distanceAu": 28197764.475370742, "description": "A star 135 parsecs away, 6.6 times the Sun's width, measured from its light.", "systemName": "Pleione system", "aliases": [ @@ -146,9 +146,9 @@ "referenceFrame": "sun-icrf", "epochJdTt": 2461286.5, "originM": [ - 2051473778228112000, - 3195117817918385700, - 1701379208744829700 + 2079852055305766400, + 3239316256960119000, + 1724914586633757000 ], "presentationToReference": [ 0.4930508324575997, diff --git a/src/objects/pleione/source/plane-placement.json b/src/objects/pleione/source/plane-placement.json new file mode 100644 index 00000000000..1786da3f297 --- /dev/null +++ b/src/objects/pleione/source/plane-placement.json @@ -0,0 +1,14 @@ +{ + "generator": ".local/pleiades-star-placement.mts", + "kind": "adopted-plane", + "hip": 17851, + "referenceDirectionIcrsDegrees": [ + 56.67978318, + 24.10845447 + ], + "dustNormalDepthPc": 136, + "starNormalDepthPc": 136.7, + "radialDistancePc": 136.70661994364193, + "basis": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "preservedReferenceMeasurements": "source/measurements.json" +} diff --git a/src/objects/pleione/source/preparation/new-object.json b/src/objects/pleione/source/preparation/new-object.json index 680f7ca546f..00239b96aab 100644 --- a/src/objects/pleione/source/preparation/new-object.json +++ b/src/objects/pleione/source/preparation/new-object.json @@ -33,10 +33,9 @@ "url": "https://ui.adsabs.harvard.edu/abs/2001A%26A...378..861C" }, "distance": { - "value": 134.84134308, - "source": "Hunt & Reffert (2023), Improving the open cluster census. II. An all-sky cluster catalogue with Gaia DR3, A&A 673, A114; CDS J/A+A/673/A114, Table 3 (clusters), Melotte_22: dist50 134.84134308 pc, the distance of the Pleiades, of which Pleione is a member; its own parallax (McDonald, Zijlstra & Watson 2017 adopt 117.096 pc from Gaia DR1 or the Hipparcos reduction of van Leeuwen 2007) is less certain than the cluster's depth (half its members within 2.70 pc of the centre), and the Hipparcos-era parallaxes of the bright Pleiades are the ones the cluster's distance controversy showed biased", - "url": "https://doi.org/10.1051/0004-6361/202346285", - "uncertainty": 2.7 + "value": 136.70661994364193, + "source": "Adopted Pleiades model geometry: normal depth 136.7 pc, 0.7 pc beyond the dust model's normal-depth reference of 136.0 pc along ICRS RA 56.67978318 deg, Dec 24.10845447 deg. Individual bright-star depths and their common plane are assumptions; measured sky positions, observed photometry and published parallax/facts remain separate.", + "url": "https://doi.org/10.1051/0004-6361/202346285" }, "planets": [], "companions": [], diff --git a/src/sources/allwise-pleiades-infrared.json b/src/sources/allwise-pleiades-infrared.json new file mode 100644 index 00000000000..521f8dcd0f6 --- /dev/null +++ b/src/sources/allwise-pleiades-infrared.json @@ -0,0 +1,31 @@ +{ + "id": "allwise-pleiades-infrared", + "kind": "data-product", + "identityLevel": "work", + "title": "AllWISE Atlas W3/W4 imaging of the Pleiades", + "identifiers": [], + "links": [ + { + "role": "archive", + "url": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "label": "Primary data and documentation" + } + ], + "publisher": "NASA/IPAC IRSA", + "relations": [], + "evidence": [ + { + "url": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/", + "checkedOn": "2026-10-25", + "locator": "Tiles 0561p242_ac51 and 0577p242_ac51; intensity, uncertainty and coverage, processed at a common 18 arcsec resolution." + } + ], + "statements": [ + { + "kind": "credit", + "text": "NASA/JPL-Caltech/UCLA; AllWISE Atlas data.", + "scope": "Pleiades dust model", + "evidence": "https://irsa.ipac.caltech.edu/data/WISE/docs/release/AllWISE/" + } + ] +} diff --git a/src/sources/draine-2021-mmmp-isrf.json b/src/sources/draine-2021-mmmp-isrf.json new file mode 100644 index 00000000000..4aca7ad98a0 --- /dev/null +++ b/src/sources/draine-2021-mmmp-isrf.json @@ -0,0 +1,36 @@ +{ + "id": "draine-2021-mmmp-isrf", + "kind": "data-product", + "identityLevel": "work", + "title": "Modified MMP solar-neighborhood interstellar radiation field, U = 1", + "identifiers": [], + "links": [ + { + "role": "archive", + "url": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "label": "Primary data and documentation" + }, + { + "role": "landing", + "url": "https://doi.org/10.3847/1538-4357/abff51", + "label": "Published field model" + } + ], + "publisher": "Princeton University", + "relations": [], + "evidence": [ + { + "url": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz", + "checkedOn": "2026-10-25", + "locator": "Draine et al. (2021), ApJ 917, 3, section 2.1; unreddened U = 1 table, 2,500 wavelengths; λuλ in erg/cm³; optical I/V/B mean intensities sampled without amplitude fitting." + } + ], + "statements": [ + { + "kind": "credit", + "text": "Draine et al. (2021); author-hosted mMMP illuminating spectrum.", + "scope": "Pleiades dust model", + "evidence": "https://www.astro.princeton.edu/~draine/PAHspec/mMMP/isrf_mmpisrf_0.00.gz" + } + ] +} diff --git a/src/sources/gibson-nordsieck-2003-pleiades-photometry.json b/src/sources/gibson-nordsieck-2003-pleiades-photometry.json new file mode 100644 index 00000000000..62682429172 --- /dev/null +++ b/src/sources/gibson-nordsieck-2003-pleiades-photometry.json @@ -0,0 +1,36 @@ +{ + "id": "gibson-nordsieck-2003-pleiades-photometry", + "kind": "data-product", + "identityLevel": "work", + "title": "The Pleiades Reflection Nebula I: calibrated wide-field optical photometry", + "identifiers": [], + "links": [ + { + "role": "archive", + "url": "http://physics.wku.edu/~gibson/offprints/gibson_2003_pleiades_phot_color.pdf", + "label": "Primary measurement and documentation" + }, + { + "role": "landing", + "url": "https://doi.org/10.1086/374589", + "label": "Published method" + } + ], + "publisher": "American Astronomical Society; author offprint at Western Kentucky University", + "relations": [], + "evidence": [ + { + "url": "http://physics.wku.edu/~gibson/offprints/gibson_2003_pleiades_phot_color.pdf", + "checkedOn": "2026-10-25", + "locator": "Section 3.4, Figures 7–9; 5 × 1.7 degree BJ mosaic, centered at 4,400 Å. General nebula: 22.1–22.9 B mag/arcsec²; surrounding structures: 24.2–25.4; near 1 degree: 25.0. Common sky-zero uncertainty: 25.6 mag/arcsec². Regional ranges, not matched apertures." + } + ], + "statements": [ + { + "kind": "credit", + "text": "Steven J. Gibson and Kenneth H. Nordsieck (2003). Optical data constrain brightness only, never dust geometry or local texture.", + "scope": "Pleiades dust model", + "evidence": "http://physics.wku.edu/~gibson/offprints/gibson_2003_pleiades_phot_color.pdf" + } + ] +} diff --git a/src/sources/iras-iris-100um-pleiades.json b/src/sources/iras-iris-100um-pleiades.json new file mode 100644 index 00000000000..79125384b27 --- /dev/null +++ b/src/sources/iras-iris-100um-pleiades.json @@ -0,0 +1,36 @@ +{ + "id": "iras-iris-100um-pleiades", + "kind": "data-product", + "identityLevel": "work", + "title": "IRIS IRAS 100 µm numeric HiPS cutout around the Pleiades", + "identifiers": [], + "links": [ + { + "role": "archive", + "url": "https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties", + "label": "Primary measurement and documentation" + }, + { + "role": "landing", + "url": "https://doi.org/10.1086/427938", + "label": "Published method" + } + ], + "publisher": "IRAP/CADE; CDS HiPS2FITS; IRAS/IRIS", + "relations": [], + "evidence": [ + { + "url": "https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties", + "checkedOn": "2026-10-25", + "locator": "ivo://ov-gso/P/IRIS/4; 10 degree TAN field, 512 × 512 pixels, RA 56.68°, Dec 24.108°. MJy/sr from provider properties; 4.3 arcmin beam. Relative beam-scale structure only; no supplied quality or uncertainty arrays." + } + ], + "statements": [ + { + "kind": "credit", + "text": "Miville-Deschenes and Lagache (2005); IRAS/IRIS, IRAP/CADE. Numeric dust-emission cutout.", + "scope": "Pleiades dust model", + "evidence": "https://cade.irap.omp.eu/documents/Ancillary/4Aladin/IRIS_04/properties" + } + ] +} diff --git a/src/sources/noirlab-noao-m45.json b/src/sources/noirlab-noao-m45.json new file mode 100644 index 00000000000..8202cd624e9 --- /dev/null +++ b/src/sources/noirlab-noao-m45.json @@ -0,0 +1,52 @@ +{ + "id": "noirlab-noao-m45", + "kind": "data-product", + "identityLevel": "work", + "title": "M45 Pleiades — NOIRLab noao-m45", + "identifiers": [ + { + "type": "NOIRLab image", + "value": "noao-m45" + } + ], + "links": [ + { + "role": "landing", + "url": "https://noirlab.edu/public/images/noao-m45/", + "label": "Published observation" + }, + { + "role": "original", + "url": "https://noirlab.edu/public/media/archives/images/original/noao-m45.tif", + "label": "Publisher original, 9700 × 7080 pixels" + }, + { + "role": "archive", + "url": "https://www.astropix.org/image/noirlab/noao-m45", + "label": "B/V/I bands, WCS and reuse terms" + } + ], + "publisher": "NSF's NOIRLab", + "relations": [], + "evidence": [ + { + "url": "https://www.astropix.org/image/noirlab/noao-m45", + "checkedOn": "2026-10-25", + "locator": "WIYN 0.9-m Mosaic I; B 436 nm, V 537 nm and I 805 nm; TAN WCS, native dimensions 9700 × 7080. The comparison uses the publisher JPEG decoded as 1600 × 1168 pixels, not the original TIFF. Seven stars verify the inherited WCS to 3.42 arcseconds maximum. Publisher display composite, not calibrated radiance." + } + ], + "statements": [ + { + "kind": "credit", + "text": "NOIRLab/NSF/AURA/T.A. Rector (University of Alaska Anchorage), R. Cool (University of Arizona) and WIYN", + "scope": "Published source", + "evidence": "https://www.astropix.org/image/noirlab/noao-m45" + }, + { + "kind": "rights", + "text": "Creative Commons Attribution 4.0 International", + "scope": "Published source", + "evidence": "https://www.astropix.org/image/noirlab/noao-m45" + } + ] +} diff --git a/src/sources/spitzer-mips-pleiades-58.json b/src/sources/spitzer-mips-pleiades-58.json new file mode 100644 index 00000000000..bcfbcc9e8cf --- /dev/null +++ b/src/sources/spitzer-mips-pleiades-58.json @@ -0,0 +1,31 @@ +{ + "id": "spitzer-mips-pleiades-58", + "kind": "data-product", + "identityLevel": "work", + "title": "Spitzer MIPS Pleiades program 58, AORs 8798976 and 8798720", + "identifiers": [], + "links": [ + { + "role": "archive", + "url": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "label": "Primary data and documentation" + } + ], + "publisher": "NASA/IPAC IRSA", + "relations": [], + "evidence": [ + { + "url": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/", + "checkedOn": "2026-10-25", + "locator": "MIPS 24/70 µm PBCD intensity, uncertainty and coverage; 70 µm scan stripes excluded from fine column inference." + } + ], + "statements": [ + { + "kind": "credit", + "text": "NASA/JPL-Caltech; Spitzer program 58, PI Rieke.", + "scope": "Pleiades dust model", + "evidence": "https://irsa.ipac.caltech.edu/data/SPITZER/docs/mips/" + } + ] +}